Mar*_*lez 9 python list deep-copy
正当我以为我已经理解了Python列表如何工作......
>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我正在使用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]]
Run Code Online (Sandbox Code Playgroud)
为什么这次b的变化会受到影响?与前面的例子有什么不同?
Ela*_*zar 11
切片操作x[:]使浅拷贝.这意味着,外部列表不同,但包含完全相同的元素.假设a = [[1]]:
b = a[:] # is the same as:
b = [x for x in a]
>>> a[0] is b[0]
True
Run Code Online (Sandbox Code Playgroud)
双切片([:][:])只是做了 - 再次:
b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]
>>> a[0] is b[0]
True
Run Code Online (Sandbox Code Playgroud)
浅拷贝的浅拷贝是浅拷贝.
所以b仍然是一个浅层副本a- 这些列表是不同的对象,但它们包含相同的元素.然后你改变内部列表b,但它是相同的列表a.
可以使用2级浅拷贝b=[x[:] for x in a].它以相同的方式扩展到n级复制.
顺便说一句,术语"浅拷贝"对于任何类或容器具有相同的含义.
如果您想要真正的深层复制,则应考虑使用深层复制.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |