所以,我理解这一点:
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
。
答案 0 :(得分:0)
一切是一个参考。列表索引只是引用,就像名称(变量)一样。
所以a_list[2]
是对列表对象的引用,就像a_list[0]
是对整数对象的引用一样。您创建了a_list
的浅表副本,这意味着所有3个引用都被复制到新的列表对象。
Ergo,b_list[2]
引用与a_list[2]
相同的对象,另一个列表对象。通过a_list[2]
或b_list[2]
修改该列表对象将使更改可见。
如果您还需要复制引用的对象,请创建一个深层副本。您可以使用copy.deepcopy()
递归复制所有内容,或使用列表解析仅创建直接嵌套列表的浅层副本。