我在shell中尝试了以下情形。
root(index){
while(this.array[index] !== index) index = this.array[index];
return index;
}
为什么复制应该创建引用时a和cp为什么不同? 而这另一种情况按预期工作。
import copy
a = [1, 2, [3, 4], 5]
cp = copy.copy(a)
a.append(6)
print a # [1, 2, [3, 4], 5, 6]
print cp # [1, 2, [3, 4], 5]
差异背后的逻辑是什么?
答案 0 :(得分:3)
来自docs:
浅表副本构造一个新的复合对象,然后(到 在可能的范围内)将引用插入其中 原始的。
因此,在复制cp
后指向一个 new 列表对象,但是cp[2]
仍然是对该列表a[2]
的引用 。您可以使用id()
函数进行验证:
>>> import copy
>>> a = [1, 2, [3, 4], 5]
>>> cp = copy.copy(a)
>>> id(a) == id(cp)
False
>>> id(a[2]) == id(cp[2])
True
与deepcopy()
比较:
>>> cp2 = copy.deepcopy(a)
>>> id(a) == id(cp2)
False
>>> id(a[2]) == id(cp2[2])
False