Python的列表技巧?

问题描述

我热衷于学习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指向与l2l1相同的存储位置。对这三个变量中的任何一个进行任何修改都会反映所有三个变量。
当您执行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中的元素也将删除,因为它们共享相同的内存位置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...