Python 通过与现有列表相乘来创建新的列表对象是否等同于创建深度副本?

Python 通过与现有列表相乘来创建新的列表对象是否等同于创建深度副本?,python,list,deep-copy,Python,List,Deep Copy,例如,假设我想制作列表a的深度副本,称为b: 以下两者之间有什么区别吗 import copy b = copy.deepcopy(a) 以及: 在这两种情况下,我都创建了一个新对象,即ida==idb为False,那么我应该理解有什么实际差异吗?谢谢 不,它们不相等。乘法运算符只生成一个浅拷贝。深度副本意味着列表中的引用也会被复制,即创建新引用,而浅层副本只会创建顶级引用的新副本,而不会复制其中的引用,如下所示: import copy a = [[],[]] b = copy.deepco

例如,假设我想制作列表a的深度副本,称为b:

以下两者之间有什么区别吗

import copy
b = copy.deepcopy(a)
以及:


在这两种情况下,我都创建了一个新对象,即ida==idb为False,那么我应该理解有什么实际差异吗?谢谢

不,它们不相等。乘法运算符只生成一个浅拷贝。深度副本意味着列表中的引用也会被复制,即创建新引用,而浅层副本只会创建顶级引用的新副本,而不会复制其中的引用,如下所示:

import copy
a = [[],[]]
b = copy.deepcopy(a)
c = a * 1
for i, v in enumerate(a):
    print(id(v), id(b[i]), id(c[i]))
这将产生:

31231832 31261480 31231832
31260800 31261400 31260800

对一个是深拷贝,另一个是浅拷贝。在这种特殊情况下没有区别,但如果您有可变对象,这可能会导致意外的结果谢谢,这是有道理的。因此,在复制可变对象的容器时,差异会变得明显。在这种情况下,使用乘法运算符是否与制作浅拷贝相同?有什么理由我想用b=copy.copya来代替吗?谢谢使用b=copy.copya可以使它更具可读性,但也稍微冗长一些。制作浅拷贝的一种更常见、更通俗的方法是使用b=A[:]。@trillian no,除了清晰之外。对于列表,您通常只使用my_list.copy。一个更标准的习语是my_list[:],pythonistas会理解它。我发现我的列表*1更加晦涩难懂。@juanpa.arrivillaga,是的,我同意我的列表*1更加晦涩难懂,事实上我的问题是在试图理解别人的代码时产生的,这些代码充满了我的列表*1语法!我正在查看的代码有以下许多实例:a=np.array[[1,2,3,4,5],[1,2,3,4,5]]和b=a[:]*1。在这种情况下,当容器的内容发生乘法时,我们必须等价于深度复制,不是吗?
import copy
a = [[],[]]
b = copy.deepcopy(a)
c = a * 1
for i, v in enumerate(a):
    print(id(v), id(b[i]), id(c[i]))
31231832 31261480 31231832
31260800 31261400 31260800