2016-11-21 90 views
1

我想使用for循环更新列表,我知道它不起作用,但我不确定什么是最好的方式来做到这一点。使用列表理解来更新for循环中的列表

l = ['axy','axy','bxy','cxy'] 

for i in l: 

    item = 'ax' 
    l = [s for s in l if not s.startswith(item)] 
    print l 

输出:

['bxy', 'cxy'] 
['bxy', 'cxy'] 
['bxy', 'cxy'] 
['bxy', 'cxy'] 

预期输出:

['bxy', 'cxy'] 
['bxy', 'cxy'] 
['bxy', 'cxy'] 

#1 less loop as the list should've been updated to l = ['bxy','cxy'] after the first loop 

它告诉我,该名单得到更新,但迭代没有,反正是有,我可以在使用列表理解循环?

我用这来删除文件,因此当文件被删除,我需要更新的列表,以便它不会再次提示。

+0

删除最后一个'打印l' –

+0

嗨编辑我的代码输出,更清楚地表明我现在想要的。 – BernardL

回答

2

您正在迭代一个包含四个项目的列表,并且在您打印列表的每次迭代时 - 这是前四个打印。最后一个来自程序的最后一行:print l

四次迭代来自这样一个事实,即列表在进入循环时有4个项目。 ,虽然循环中你只是压倒一切的指针列表l被重复列表(原始列表仍然只存在,现在,你重新分配l后,您不能再访问)。

+0

如果我使用类似remove的东西,它会算作重写,但仍然不会被访问? – BernardL

+1

@BernardL如果你使用'remove',你会修改你正在迭代的列表,这可能会导致不同类型的问题。尝试用一种描述*你想达到什么的方式提问,而不是*你如何去做。可能还有其他(更简单)的方法来实现你的目标,比如构建一个新列表,并且只添加你感兴趣的项目。 – alfasin

-1

这是因为赋值总是创建一个新的引用并且不会更新列表。

当for循环进行评价l用它的当前值代替。现在,这不会发生在循环的每一次迭代中。它只发生一次。

你改变了循环内的值l使用'='它创建了新的引用,所以名称l完全指向一个不同的列表。它不会影响已在for循环中评估的列表。

如果使用操作其更新列表就地像updateremove你会看到你期待

+0

我只是想解释他的代码中发生了什么。 –