Python中的浅拷贝与深拷贝
我不知道为什么q充当指针。最后的列表L是:Python中的浅拷贝与深拷贝,python,Python,我不知道为什么q充当指针。最后的列表L是:[13、[28、[24、[3,无]]]] 我不明白如何将[3,无]添加到它中 import sys; def main( argv=sys.argv ) : L = [24, None] t = [13, None] t[1] = L L = t t = [28, None] t[1] = L[1] L[1] = t
[13、[28、[24、[3,无]]]]
我不明白如何将[3,无]
添加到它中
import sys;
def main( argv=sys.argv ) :
L = [24, None]
t = [13, None]
t[1] = L
L = t
t = [28, None]
t[1] = L[1]
L[1] = t
t = [3, None]
p = L
while p != None :
q = p
p = p[1]
if p == L :
L = t
else :
q[1] = t
print L
if __name__ == "__main__" :
main()
当你在做的时候
if p == L:
L = t
else:
q[1] = t
q实际上是指针,它是[24,无]
,然后执行q[1]=t
,因此它将变成[24,[3,无]]
此时,L实际上是[13,[28,q]]
因此,它将更改包含对象引用的L列表中最内部的列表。如果这些对象是可变的,则当可变对象发生更改时,列表可能会出现更改。事实上,列表并没有改变,只是被引用对象的内容。您可以使用
id()
您的代码正在修改原始的[24,无]
列表。下面是一些额外的print
语句,以查看发生了什么:
L = [24, None] # Creates a list, which is a mutable object
print(id(L)) # Here is its unique ID.
t = [13, None]
t[1] = L
L = t
t = [28, None]
t[1] = L[1]
L[1] = t
print(L,id(L[1][1])) # Current contents of L, contains the same mutable list
t = [3, None]
p = L
while p:
q = p # q = [13, [28, [24, None]]], [28, [24, None]], [24, None]
p = p[1] # p = [28, [24, None]] , [24, None] , None
print(L,id(L[1][1])) # Here is L again, still contains the same mutable list
print(q,id(q)) # q also references the same mutable list
if p == L: # False
L = t
else:
q[1] = t # Mutate that same list!
print(L)
输出如下。请注意,[24,None]
列表在所有情况下都具有相同的ID,因此当您更改q
中的None
元素时,L
引用了相同的列表,并且似乎也在更改
64809160
[13, [28, [24, None]]] 64809160
[13, [28, [24, None]]] 64809160
[24, None] 64809160
[13, [28, [24, [3, None]]]]
下面是一个简单的例子:
>>> q = [1,2,3] # Create a list named 'q'
>>> L = [24, q] # Put that list in L
>>> L
[24, [1, 2, 3]]
>>> q[1] = 5 # change 'q'
>>> L # L appears to change. It references the same list.
[24, [1, 5, 3]]
你能把只包含你不懂的操作的代码(简化成一个工作示例)吗?还有一件事,当你在做作业时,你总是在做浅拷贝而不是深拷贝。为什么t改变时L不改变,即使t和L指向同一个列表。@user285227,你的意思是哪里L=t;t=[28,无]
L
成为t
引用的同一列表的名称,但是t
成为对全新列表的引用。