问题描述
我热衷于学习pythoninstitute.org的课程材料,其中一项测验包括:
l1 = ["A","B","C"]
l2 = l1
l3 = l2
del l1[0]
del l2[:]
print(l3)
我期望['B'。 'C']作为print(l3)的结果,同时正确的结果是[]。
我不明白为什么。你能给我解释一下吗?
要获得我期望的结果,我必须按如下所示进行编码:
l1 = ["A","C"]
l2 = l1
l3 = l2
del l1[0]
l4 = l2[:]
del l4
print(l3)
解决方法
l2 = l1
l3 = l2
l2
指向与l1
相同的存储位置,因此l3
指向与l2
和l1
相同的存储位置。对这三个变量中的任何一个进行任何修改都会反映所有三个变量。
当您执行l4 = l1[:]
时,l4
将成为l1
的副本,而不仅仅是指向与l1
相同的位置。
这是因为,当您将一个列表分配给另一个列表时,它只是通过另一个变量为同一存储创建了一个引用。 l1,l2,l3都引用相同的数据。
当您从一个列表中删除一个元素时,数据将反映所有引用该数据的变量。
在第二个代码中,您可能会得到与以下相同的结果。基本上,您通过执行del l1 [0]从所有变量l1,l2,l3的0索引中删除值 '
l1 = ["A","B","C"]
l2 = l1
l3 = l2
del l1[0]
print(l3)
'
,del l[:]
这将清除整个列表。并且由于所有这些变量都指向相同的内存位置(如上一个答案中提到的那样),因此您可以获得该结果。 另请参阅文档。 https://docs.python.org/3/tutorial/datastructures.html
,在python中,使用.copy()方法创建列表的副本,如果将一个列表分配给另一个列表,它将共享相同的内存位置。 in the image you can find the difference between list.copy() and assign
lst1 = [1,2,3,4]
lst2 = lst1
lst3 = lst1.copy()
print("lst1 address : ",hex(id(lst1)))
print("lst2 address : ",hex(id(lst2)))
print("lst3 address : ",hex(id(lst3)))
lst1 address : 0x1f00c983f00
lst2 address : 0x1f00c983f00
lst3 address : 0x1f00a3127c0
如果删除列表1中的元素,则列表2中的元素也将删除,因为它们共享相同的内存位置。