我们说我有:
a = 1
b = 2
C = 'r'
my_list = [a,b,c]
现在让我们说a,b和c是未知的,我不知道他们的名字。
如果我这样做:
for x in my_list: del x
它没有用。 a,b,c尚未删除。
有人能解释我为什么吗?
答案 0 :(得分:1)
正如@Coldspeed在评论中提到的那样,您删除的变量x
与list
对象中的元素不同。
如果您尝试分配到x
:
for x in my_list: x='bla' #does not modify anything in my_list
但是,由于这些项是对同一内存块的引用,因此比较x is my_list[0]
将等同于第一次循环迭代中的True
。
因此,可以通过共享引用的使用对list
执行操作,例如:
for x in my_list[:]: my_list.remove(x) #results in an empty list
必须注意首先创建列表的副本并迭代这些项目,如前面的行中所做的那样。如果你仓促并循环遍历动态变化列表的项目,你将会遇到更多的蟒蛇魔法。
for x in my_list: my_list.remove(x) #the first element gets deleted, then the second element in the list, which now has length 2, is deleted.
#Final result is the list [2] remaining
答案 1 :(得分:1)
这里有多个问题:
a = 1
b = 2
my_list = [a,b]
将值1
和2
分配给列表,而不是变量。您可以使用可变对象来满足您的需求:Immutable vs Mutable types
for x in my_list:
del x
就像在 1中一样。 x
只是列表中的值(例如1
,2
,'c'
),但更糟糕的是,它是对记忆的额外参考计数
删除它会导致减少计数器,而不是从内存中删除值,因为原始列表至少还有一个计数器(在您的情况下,从一开始就是变量(a,b,c
))。
更多信息: Arguments are passed by assignment
for x in my_list:
del x
包含其他问题。如果要将代码更改为mylist.remove(x)
,至少要从列表中删除entrie,您还会跳过列表中的每个第二个成员。快速示例:
li = [1,2,3]
for x in li:
li.remove(x)
第一次迭代将是x = 1
。从1
删除li
会导致li = [2,3]
。然后循环继续使用列表中的第二个位置:x=3
并删除它。 2
已被跳过。
使用[:]
运算符使用列表副本可以避免这种情况:
for x in li[:]:
li.remove(x)
这最终导致一个空列表