Arrays &引用;通过值传递的参数";CLRS算法

Arrays &引用;通过值传递的参数";CLRS算法,arrays,algorithm,pointers,parameter-passing,Arrays,Algorithm,Pointers,Parameter Passing,作者所说的“表示对象的数据被复制,但对象的属性没有被复制”是什么意思?有人给我举了一个例子,说明这在实践中是如何工作的,可能是在python、java或C中 以下是CLRS算法第一章的摘录 “我们通过值将参数传递给过程:被调用的过程接收自己的参数副本,如果它为参数赋值,则调用过程看不到更改。传递对象时,将复制指向表示对象的数据的指针,但不会复制对象的属性。例如,如果x是被调用过程的参数,则调用过程看不到被调用过程中的赋值x=y。但是,赋值x.f=3是可见的。类似地,数组是通过指针传递的,因此传

作者所说的“表示对象的数据被复制,但对象的属性没有被复制”是什么意思?有人给我举了一个例子,说明这在实践中是如何工作的,可能是在python、java或C中


以下是CLRS算法第一章的摘录

“我们通过值将参数传递给过程:被调用的过程接收自己的参数副本,如果它为参数赋值,则调用过程看不到更改。传递对象时,将复制指向表示对象的数据的指针,但不会复制对象的属性。例如,如果x是被调用过程的参数,则调用过程看不到被调用过程中的赋值x=y。但是,赋值x.f=3是可见的。类似地,数组是通过指针传递的,因此传递的是指向数组的指针,而不是整个数组,并且对单个数组元素的更改对调用过程可见。”


提前感谢您帮助我解决这个问题。

这是几乎所有现代命令式编程语言的正常行为,它们具有不变的原语和可变的对象,如Java、Python、Javascript等。我将使用Javascript作为示例,但如果您不懂Javascript,希望代码很简单呃,不管怎样,你都能理解这个解释


考虑以下声明变量并调用函数的代码:

函数foo(x){ x=5; } 变量y=2; 傅(y),; console.log(y);//输出编号2 函数中的变量
x
y
中获取其值,但它是存储在内存中不同位置的不同变量。因此,当函数将数字5分配给
x
时,数字5既也分配给
y
;在
x
中的变化“不可见”“职能之外

现在考虑这个代码,它本质上是一样的,只是用一个对象而不是一个数字:

功能条(x){
x={a:3,b:4};
}
变量y={a:1,b:2};
巴(y);
控制台日志(y);//输出{a:1,b:2}
同样,
x
y
中获取其值(这是对对象的引用),但是为
x
分配一个新的引用不会改变
y
保留的引用,因为它们存储在不同的内存位置

最后一个例子:

功能baz(x){
x、 a=3;
x、 b=4;
}
变量y={a:1,b:2};
baz(y);
控制台日志(y);//产出{a:3,b:4}
这一次,函数
baz
确实会更改结果,因为
y
持有对对象的引用,而调用函数时,
x
持有对同一对象的引用(而不是对象的副本),因此对其属性的指定在函数外部“可见”


如果你觉得这一切都很简单,那么你可以忽略这一段;这只是解释他们在书中使用的语言有这些行为。本段的目的是澄清其语言的语义,因为并非所有语言中的所有函数都以这些方式运行

例如,在C++中,可以编写<代码> Foo和 Bar < /Cord>,这样它们就可以改变Y的“距离”值。或者,在对象不可变的函数式编程语言中,
baz
不会更改对象
y
,而是会创建具有不同属性的新对象,这些属性在函数外部不可见


因此,他们书中的这一段对于那些可能更熟悉函数参数的其他语义的读者来说是一个有用的澄清。

这是几乎所有现代命令式编程语言的正常行为,这些语言具有不变的原语和可变的对象,如Java、Python、Javascript等等。我将使用Javascript作为示例,但如果您不懂Javascript,希望代码足够简单,您能够理解解释


考虑以下声明变量并调用函数的代码:

函数foo(x){ x=5; } 变量y=2; 傅(y),; 控制台日志(y);//产出2 函数中的变量
x
y
获取其值,但它是存储在内存中不同位置的不同变量。因此,当函数将数字5分配给
x
时,数字5不是也分配给
y
x
中的更改在功能外不“可见”

现在考虑这个代码,它本质上是一样的,只是用一个对象而不是一个数字:

功能条(x){
x={a:3,b:4};
}
变量y={a:1,b:2};
巴(y);
控制台日志(y);//输出{a:1,b:2}
同样,
x
y
中获取其值(这是对对象的引用),但是为
x
分配一个新的引用不会改变
y
保留的引用,因为它们存储在不同的内存位置

最后一个例子:

功能baz(x){
x、 a=3;
x、 b=4;
}
变量y={a:1,b:2};
baz(y);
控制台日志(y);//产出{a:3,b:4}
这一次,函数
baz
确实会更改结果,因为
y
持有对对象的引用,而调用函数时,
x
持有对同一对象的引用(而不是对象的副本),因此对其属性的指定在函数外部“可见”


如果你觉得这一切都很简单,那么你可以忽略这一段;这只是解释他们在书中使用的语言有这些行为。本段的目的是澄清其语言的语义,因为并非所有功能