gpt4 book ai didi

python - 复制 python 列表

转载 作者:太空狗 更新时间:2023-10-29 20:11:15 24 4
gpt4 key购买 nike

就在我以为我已经理解了 Python 列表的工作原理时...

>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]

到目前为止,还不错。我用 a 的内容初始化 b,以便 b 指向不同的对象。因此,b 的变化不会影响 a。

现在看看另一个例子:

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:][:]
>>> b
[[1,2,3],[4,5,6],[7,8,9]]
>>> b[1][1] = 100
>>> b
[[1,2,3],[4,100,6],[7,8,9]]
>>> a
[[1,2,3],[4,100,6],[7,8,9]]

为什么这次 b 的变化影响了 a?与前面的示例有何不同?

最佳答案

切片操作 x[:] 生成了一个浅拷贝。这意味着,外部列表不同,但包含完全相同的元素。假设 a = [[1]]:

b = a[:] # is the same as:
b = [x for x in a]

>>> a[0] is b[0]
True

双切片 ([:][:]) 仅此而已 - 再一次:

b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]

>>> a[0] is b[0]
True

浅拷贝的浅拷贝就是浅拷贝。

所以 b 仍然是 a 的浅拷贝——这些列表是不同的对象,但它们包含相同的元素。然后你改变 b 中的内部列表,但它与 a 中的列表相同。

二级浅拷贝可以用b=[x[:] for x in a]来完成。同理扩展n级拷贝。

顺便说一下,术语“浅拷贝”对于任何类或容器都具有相同的含义。

如果你想要真正的深拷贝,你应该考虑使用deep copy .

关于python - 复制 python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17096298/

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