通过从列表中删除元素来删除元素

时间:2018-02-15 13:01:46

标签: python list variables

我们说我有:

a = 1
b = 2
C = 'r'

my_list = [a,b,c]

现在让我们说a,b和c是未知的,我不知道他们的名字。

如果我这样做:

for x in my_list: del x

它没有用。 a,b,c尚未删除。

有人能解释我为什么吗?

2 个答案:

答案 0 :(得分:1)

正如@Coldspeed在评论中提到的那样,您删除的变量xlist对象中的元素不同。

如果您尝试分配到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)

这里有多个问题:

1。列表中的变量

a = 1
b = 2
my_list = [a,b]

将值12分配给列表,而不是变量。您可以使用可变对象来满足您的需求:Immutable vs Mutable types

2。从listvalue中删除副本

for x in my_list:
    del x

就像在 1中一样。 x只是列表中的值(例如12'c'),但更糟糕的是,它是对记忆的额外参考计数 删除它会导致减少计数器,而不是从内存中删除值,因为原始列表至少还有一个计数器(在您的情况下,从一开始就是变量(a,b,c))。

更多信息: Arguments are passed by assignment

3。迭代时删除

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)

这最终导致一个空列表