作者所说的“表示对象的数据被复制,但对象的属性不是复制的”这句话是什么意思,有人给了我一个例子,说明它在实践中是如何工作的,也许是在python、java或C中?
以下是CLRS算法第一章的摘录。
“我们通过值将参数传递给过程:被调用的过程收到自己的参数副本,如果它为参数指定值,则调用过程不会看到更改。当传递对象时,指向表示对象的数据的指针将被复制,但对象的属性不会被复制。例如,如果x是被调用过程的参数,则调用过程中的赋值x=y对调用过程不可见。然而,赋值x.f =3是可见的。类似地,数组通过指针传递,从而传递指向数组的指针,而不是整个数组,对单个数组元素的更改对调用过程是可见的“
提前谢谢你帮我解决这个问题。
发布于 2019-11-11 02:24:57
这是几乎所有现代命令式编程语言的正常行为,这些语言具有不变的原语和可变的对象,例如Java、Python、Javascript等等。我将使用Javascript作为例子,但是如果您不知道Javascript,希望代码足够简单,您可以理解这个解释。
考虑下面的代码,它声明一个变量并调用一个函数:
function foo(x) {
x = 5;
}
var y = 2;
foo(y);
console.log(y); // outputs number 2函数中的变量x从y中获取其值,但它是存储在内存中不同位置的不同变量。因此,当函数将数字5分配给x时,数字5是,而不是,也分配给y;在函数之外,x中的变化是不可见的。
现在考虑一下下面的代码,它本质上是相同的,只使用一个对象而不是一个数字:
function bar(x) {
x = { a: 3, b: 4 };
}
var y = { a: 1, b: 2 };
bar(y);
console.log(y); // outputs { a: 1, b: 2 }同样,x从y (它是对对象的引用)获得它的值,但是为x分配一个新的引用并不会改变y保存的引用,因为它们存储在不同的内存位置。
最后一个例子是:
function baz(x) {
x.a = 3;
x.b = 4;
}
var y = { a: 1, b: 2 };
baz(y);
console.log(y); // outputs { a: 3, b: 4 }这一次,函数baz确实更改了结果,因为y保存对对象的引用,而当函数被调用时,x保存对同一个对象的引用(而不是对象的副本),因此对其属性的赋值在函数之外是“可见的”。
如果所有这一切在你看来都很简单,那么你可以忽略这一段;它只是简单地解释了他们在书中使用的语言有这些行为。这一段的目的是澄清他们语言的语义,因为并非所有语言中的所有功能都是这样的。
例如,在C++中,可以用这样一种方式编写foo和bar,即它们将“从远处”更改y的值。或者,在对象不可变的函数式编程语言中,baz不会更改对象y,而是创建具有不同属性的新对象,这些属性在函数之外是不可见的。
因此,在他们的书中的这一段是一个有用的澄清读者谁可能更熟悉这些功能参数的其他语义。
https://stackoverflow.com/questions/58794491
复制相似问题