Python 复制列表列表[重复]
- 2025-02-14 09:50:00
- admin 原创
- 39
问题描述:
我使用的是 python 3.4.1。
对于单个列表a=[1,2]
,如果我复制它,b = a.copy()
当我更改 中的项目时b
,它不会更改 中的项目a
。
但是,当我定义列表列表(实际上是一个矩阵)时a = [[1,2],[3,4]]
,当我分配b = a.copy()
。我对列表所做的操作b
实际上会影响a
。
我检查了它们的地址,它们是不同的。
有人能告诉我为什么吗?
ps:我做的是b[0][0] = x
,并且a中的项目也改变了。
解决方案 1:
来自模块的文档copy
:
浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)有关:
浅拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象的引用插入到其中。
深层复制构造一个新的复合对象,然后以递归方式将原始对象的副本插入其中。
当您调用常规时,copy.copy()
您正在执行浅表复制。这意味着,在列表列表的情况下,您将获得外部列表的新副本,但它将包含原始内部列表作为其元素。相反,您应该使用copy.deepcopy()
,这将创建外部和内部列表的新副本。
您在第一个使用示例中没有注意到这一点的原因copy([1,2])
是,像 这样的原语int
是不可变的,因此不可能在不创建新实例的情况下更改它们的值。 如果列表的内容是可变对象(如列表或任何具有可变成员的用户定义对象),则这些对象的任何变异都会在列表的两个副本中看到。
解决方案 2:
也许是这样的列表理解:
new_list = [x[:] for x in old_list]
...但是如果你的矩阵深度超过一层,列表理解可能不如仅仅使用那么优雅deepcopy
。
编辑 - 如上所述,浅拷贝仍将包含对列表内对象的引用。例如...
>>> this = [1, 2]
>>> that = [33, 44]
>>> stuff = [this, that]
>>> other = stuff[:]
>>> other
[[1, 2], [33, 44]]
>>> other[0][0] = False
>>> stuff
[[False, 2], [33, 44]] #the same problem as before
>>> this
[False, 2] #original list also changed
>>> other = [x[:] for x in stuff]
>>> other
[[False, 2], [33, 44]]
>>> other[0][0] = True
>>> other
[[True, 2], [33, 44]]
>>> stuff
[[False, 2], [33, 44]] #copied matrix is different
>>> this
[False, 2] #original was unchanged by this assignment
解决方案 3:
非常简单,只需这样做:
b = a
例如:
>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD