【发布时间】:2017-11-06 12:03:05
【问题描述】:
所以,我明白了:
a_list = [1,2,3]
b_list = [5,6,7]
a_list.append(b_list)
a_list 目前是[1,2,3, [5,6,7]]
c_list = a_list[:]
b_list[0] = 1000
print(a_list, c_list)
a_list 是[1,2,3,[1000,6,7]]
c_list 是[1,2,3,[1000,6,7]]
a_list 和 c_list 都发生了变化,因为当 b_list 附加到 a_list 时,b_list 是对 [5,6,7] 的引用,并且对 b_list 的任何更改都会显示 a_list 和c_list。那挺好的。
问题是当你有:
a_list = [1, 2, [1,5,0]]
b_list = a_list[:]
a_list[2][1] = 90000
print(a_list, b_list)
a_list 是 [1, 2, [1, 90000, 0]],b_list 是 [1, 2, [1, 90000, 0]]。
为什么b_list 发生了变化? b_list 是a_list 的浅拷贝,如果它有引用,它将复制引用,而不是实际的对象。
但是,a_list 没有复制引用;它是一个精确值,一个数字列表,如果 a_list 中的某些值发生更改,b_list 不应更改,因为它们完全不同,b_list 不是通过赋值指向a_list。
【问题讨论】:
-
嵌套列表仍然是参考。变量是命名引用,列表中的索引是编号引用。
-
浅拷贝是一个新列表,其元素与原始列表的元素相同(这些元素的不是个副本)。如果要递归复制元素,请使用
copy.deepcopy。
标签: python slice deep-copy shallow-copy