gpt4 book ai didi

python - python中列表的深拷贝

转载 作者:行者123 更新时间:2023-12-04 02:32:24 27 4
gpt4 key购买 nike

CODE IN PYCHARM

[1]: /image/aBP1r.png

我尝试制作列表 l 的深拷贝,但似乎切片方法不起作用?我不希望 x 中的更改反射(reflect)在 l 中。那么我应该如何进行深拷贝,我的代码有什么问题呢?

这是我的代码-

def processed(matrix,r,i):
matrix[r].append(i)
return matrix

l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x=l[:]
print(processed(x,0,10))
print(l)

输出-

[[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]

最佳答案

您的代码确实成功地创建了浅拷贝。这可以通过检查两个外部列表的 ID 并注意它们的不同来看出。

>>> id(l)
140505607684808

>>> id(x)
140505607684680

或者简单地使用 is 进行比较:

>>> x is l
False

但是因为是浅拷贝而不是深拷贝,所以列表中对应的元素彼此是同一个对象:

>>> x[0] is l[0]
True

这为您提供了在附加子列表时观察到的行为。

如果实际上您想要的是深拷贝,那么您可以使用 copy.deepcopy。在这种情况下,子列表也是新对象,可以在不影响原始对象的情况下追加。

>>> from copy import deepcopy

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> xdeep = deepcopy(l)

>>> xdeep == l
True

>>> xdeep is l
False <==== A shallow copy does the same here

>>> xdeep[0] is l[0]
False <==== But THIS is different from with a shallow copy

>>> xdeep[0].append(10)

>>> print(l)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> print(xdeep)
[[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]

如果你想在你的函数中应用这个,你可以这样做:

from copy import deepcopy

def processed(matrix,r,i):
new_matrix = deepcopy(matrix)
new_matrix[r].append(i)
return new_matrix

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x = processed(l,0,10)
print(x)
print(l)

如果事实上你知道矩阵总是正好 2 深,那么你可以比使用 deepcopy 更有效地做到这一点,并且不需要 import:

def processed(matrix,r,i):
new_matrix = [sublist[:] for sublist in matrix]
new_matrix[r].append(i)
return new_matrix

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x = processed(l,0,10)
print(x)
print(l)

关于python - python中列表的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63532921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com