如果我将数据帧传递给函数并在函数内修改它,它是按值传递还是按引用传递?
我运行以下代码
a = pd.DataFrame({'a':[1,2], 'b':[3,4]})
def letgo(df):
df = df.drop('b',axis=1)
letgo(a)
Run Code Online (Sandbox Code Playgroud)
a函数调用后,值不会改变.这是否意味着它是传值?
我也试过以下
xx = np.array([[1,2], [3,4]])
def letgo2(x):
x[1,1] = 100
def letgo3(x):
x = np.array([[3,3],[3,3]])
Run Code Online (Sandbox Code Playgroud)
事实证明letgo2()确实发生了变化xx而letgo3()没有变化.为什么会这样?
目前,我正在阅读很多关于软件工程,软件设计,设计模式等的内容.来自完全不同的背景,这对我来说都是新的迷人的东西,所以如果我没有使用正确的技术术语,请耐心等待我描述某些方面;-)
我最终在大部分时间都使用了引用类(R中的OOP方法),因为面向对象似乎是我正在做的很多东西的正确选择.
现在,我想知道是否有人在R中实现MVC(模型视图控制器;也称为MVP:模型视图展示器)模式方面有一些好的建议或经验,最好使用参考类.
我也对其他"标准"设计模式(如观察者,黑板等)的信息非常感兴趣,但我不想让这个问题过于宽泛.我想最酷的事情是看到一些最小的示例代码,但任何指针,"架构",图表或任何其他想法也将非常感谢!
对于那些对类似内容感兴趣的人,我真的可以推荐以下书籍:
更新2012-03-12
我最终想出了一个我对MVC的解释的一个小例子(可能不完全正确;-)).
require("digest")
Run Code Online (Sandbox Code Playgroud)
setRefClass(
"Observer",
fields=list(
.X="environment"
),
methods=list(
notify=function(uid, ...) {
message(paste("Notifying subscribers of model uid: ", uid, sep=""))
temp <- get(uid, .self$.X)
if (length(temp$subscribers)) {
# Call method updateView() for each subscriber reference
sapply(temp$subscribers, function(x) {
x$updateView()
})
}
return(TRUE)
}
)
)
Run Code Online (Sandbox Code Playgroud)
setRefClass(
"Model",
fields=list(
.X="data.frame",
state="character",
uid="character",
observer="Observer"
),
methods=list(
initialize=function(...) {
# Make sure all …Run Code Online (Sandbox Code Playgroud) 声明的参数与var声明的参数之间的区别是什么out?编译器如何区别对待它们(例如,通过生成不同的代码,或通过更改它发出的诊断)?或者,不同的修饰符是否只允许程序员记录参数的预期用途?做了什么样的影响类型的参数对此事?
我希望有人可以为我澄清这里发生的事情.我在整数类中挖了一下但因为整数覆盖了+运算符我无法弄清楚出了什么问题.我的问题在于这一行:
Integer i = 0;
i = i + 1; // ? I think that this is somehow creating a new object!
Run Code Online (Sandbox Code Playgroud)
这是我的推理:我知道java是通过值传递(或通过引用值传递),所以我认为在下面的示例中,每次都应该递增整数对象.
public class PassByReference {
public static Integer inc(Integer i) {
i = i+1; // I think that this must be **sneakally** creating a new integer...
System.out.println("Inc: "+i);
return i;
}
public static void main(String[] args) {
Integer integer = new Integer(0);
for (int i =0; i<10; i++){
inc(integer);
System.out.println("main: "+integer);
} …Run Code Online (Sandbox Code Playgroud) 我输入以下示例:
#include <iostream>
double f(double* x, double* y)
{
std::cout << "val x: " << *x << "\n";
std::cout << "val y: " << *y << "\n";
return *x * *y;
}
double f2(double &x, double &y)
{
std::cout << "val x: " << x << "\n";
std::cout << "val y: " << y << "\n";
return x * y;
}
int main()
{
double a, b;
a = 2;
b = 3;
std::cout << f(&a, &b) << "\n";
std::cout …Run Code Online (Sandbox Code Playgroud) 我知道在JS中,对象是通过引用传递的,例如:
function test(obj) {
obj.name = 'new name';
}
var my_obj = { name: 'foo' };
test(my_obj);
alert(my_obj.name); // new name
Run Code Online (Sandbox Code Playgroud)
但为什么下面没有工作:
function test(obj) {
obj = {};
}
var my_obj = { name: 'foo' };
test(my_obj);
alert(my_obj.name); // foo
Run Code Online (Sandbox Code Playgroud)
我已经将对象设置为{}(空)但它仍然说foo.
任何人都可以解释这背后的逻辑吗?
在Swift中,结构和值类型默认按值传递,就像在C#中一样.但是C#还有一个非常有用的ref关键字,它强制参数通过引用传递,这样可以在函数内部更改同一个实例,然后从调用者的范围访问.有没有办法在Swift中实现相同的结果?
在学习新的编程语言时,您可能遇到的一个可能的障碍是,默认情况下,该语言是按值传递还是按引用传递.
所以这是我对你们所有人的问题,用你最喜欢的语言,它是如何实际完成的?什么是可能的陷阱?
language-agnostic oop parameters pass-by-reference pass-by-value
虽然可能会在互联网上的某个地方记录,但我无法找到解决问题的方法.自PHP 5.4更新以来,已删除了pass-by-references.
现在我对这段代码有一个问题,我希望有人可以看到我正在尝试用它做什么,这样他们就可以帮助我找到一个解决方案来克服我的传递引用问题.
以下是有问题的代码:
public function trigger_hooks( $command, &$client, $input ) {
if( isset( $this->hooks[$command] ) ) {
foreach( $this->hooks[$command] as $func ) {
PS3socket::debug( 'Triggering Hook \'' . $func . '\' for \'' . $command . '\'' );
$continue = call_user_func( $func, &$this, &$client, $input );
if( $continue === FALSE ) {
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
.
这最近出现在代码审查讨论中,但没有令人满意的结论.有问题的类型是C++ string_view TS的类似物.它们是指针和长度周围的简单非拥有包装器,装饰有一些自定义函数:
#include <cstddef>
class foo_view {
public:
foo_view(const char* data, std::size_t len)
: _data(data)
, _len(len) {
}
// member functions related to viewing the 'foo' pointed to by '_data'.
private:
const char* _data;
std::size_t _len;
};
Run Code Online (Sandbox Code Playgroud)
出现的问题是,是否有一种方法可以通过值或const引用来传递这些视图类型(包括即将发生的string_view和array_view类型).
支持传递值的参数等于"减少输入","如果视图具有有意义的突变,则可以改变本地副本",并且"可能效率不低".
支持pass-by-const-reference的参数相当于"通过const&'传递对象更加惯用,而'可能效率不低'.
是否有任何额外的考虑因素可以通过一种或另一种方式最终通过值或const引用传递惯用视图类型.
对于这个问题,可以安全地假设C++ 11或C++ 14语义,以及足够现代的工具链和目标体系结构等.