所以,我明白这一点:
a_list = [1,2,3]
b_list = [5,6,7]
a_list.append(b_list)
\u列表当前是[1,2,3, [5,6,7]]
c_list = a_list[:]
b_list[0] = 1000
print(a_list, c_list)
列表是[1,2,3,[1000,6,7]]
CU列表是[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
没有可复制的引用;它是一个精确的值,是一个数字列表,并且b_list
如果某个值在一个^列表中发生了变化,则b_list
不应该改变,因为它们完全不同,b_list
没有通过赋值指向a_list
。你知道吗
Python中的所有内容都是引用。列表索引只是引用,就像名称(变量)一样。你知道吗
所以
a_list[2]
是对列表对象的引用,就像a_list[0]
是对整数对象的引用一样。您创建了a_list
的浅拷贝,这意味着所有3个引用都被复制到一个新的列表对象。你知道吗因此,
b_list[2]
引用与另一个列表对象a_list[2]
相同的对象。通过a_list[2]
或b_list[2]
修改列表对象将使更改通过其中一个可见。你知道吗如果还需要复制引用对象,请创建深度副本。您可以使用
copy.deepcopy()
递归地复制所有内容,或者使用列表理解仅创建直接嵌套列表的浅层副本。你知道吗相关问题 更多 >
编程相关推荐