切片分配,浅/深拷贝

2024-05-08 01:57:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我明白这一点:

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_listc_list都发生了变化,因为当b_list被附加到a_list时,b_list是对[5,6,7]的引用,对b_list的任何变化都显示了a_listc_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_lista_list的浅拷贝,如果它有引用,它将复制引用,而不是实际对象。 但是,a_list没有可复制的引用;它是一个精确的值,是一个数字列表,并且b_list如果某个值在一个^列表中发生了变化,则b_list不应该改变,因为它们完全不同,b_list没有通过赋值指向a_list。你知道吗


Tags: 对象列表数字list指向print赋值append
1条回答
网友
1楼 · 发布于 2024-05-08 01:57:57

Python中的所有内容都是引用。列表索引只是引用,就像名称(变量)一样。你知道吗

所以a_list[2]是对列表对象的引用,就像a_list[0]是对整数对象的引用一样。您创建了a_list的浅拷贝,这意味着所有3个引用都被复制到一个新的列表对象。你知道吗

因此,b_list[2]引用与另一个列表对象a_list[2]相同的对象。通过a_list[2]b_list[2]修改列表对象将使更改通过其中一个可见。你知道吗

如果还需要复制引用对象,请创建深度副本。您可以使用copy.deepcopy()递归地复制所有内容,或者使用列表理解仅创建直接嵌套列表的浅层副本。你知道吗

相关问题 更多 >