我正在用for循环遍历一个列表,这时我意识到del似乎不起作用。我假设这是因为i表示for循环的对象,del只是删除该对象而不是引用。然而,我确信我以前做过这样的事情,而且很有效。
alist = [6,8,3,4,5] for i in alist: if i == 8: del i
在我的代码中,它实际上是一个字符串列表,但结果是一样的:即使满足if条件,删除i也没有效果。有没有一种方法可以用这种方法删除一个数字或字符串?我做错什么了吗?谢谢.
ecbunoof1#
你关于为什么你看到这种行为的想法是正确的。因此,我就不多说了。要做你想做的事情,使用列表解析(它在旧版python2中也可用)来过滤列表:
>>> alist = [6,8,3,4,5] >>> [x for x in alist if x != 8] [6, 3, 4, 5] >>> alist = [6,8,8,3,4,5] >>> [x for x in alist if x != 8] [6, 3, 4, 5] >>>
这种方法也比for循环有效得多。
fdx2calv2#
for循环在每次运行时为i分配一个新值。因此,实际上,上面的for循环
for
i
i = 6 i = 8 del i i = 3 i = 4 i = 5
但没有效果
xam8gpfp3#
del不会删除对象。它只是递减由其参数引用的对象的引用计数。在代码中
del
有6个对象:5个独立的整数,以及5个引用的列表(每个整数一个)。for循环的工作方式是对alist中的每个元素执行一次循环体,i在每次迭代中保存对alist中不同元素的引用。i引用的对象的引用计数至少为2:由alist和i本身持有的引用。当您调用del i时,您只是通过使i指向空值来减少其引用计数。虽然下面的 * 技术上 * 工作,通过删除所有(已知的)对象引用,它有自己的问题(涉及修改当前正在迭代的列表),不应该使用。
alist
del i
>>> alist=[6,8,3,4,5] >>> for i, a in enumerate(alist): ... if a == 8: ... del a # delete the loop index reference ... del alist[i] # delete the reference held by the list >>> alist [6,3,4,5]
相反,只需使用列表解析来构建一个新列表来替换旧列表即可
alist = [ x for x in alist if x != 8 ]
tktrz96b4#
如果你真的想使用del,你需要在列表中使用它:
del alist[i]
(note在这种情况下,i是一个索引,而不是你想要删除的值)但实际上,在这里你可能应该使用列表解析来创建另一个列表:
[x for x in alist if x != 8]
4条答案
按热度按时间ecbunoof1#
你关于为什么你看到这种行为的想法是正确的。因此,我就不多说了。
要做你想做的事情,使用列表解析(它在旧版python2中也可用)来过滤列表:
这种方法也比for循环有效得多。
fdx2calv2#
for
循环在每次运行时为i
分配一个新值。因此,实际上,上面的
for
循环但没有效果
xam8gpfp3#
del
不会删除对象。它只是递减由其参数引用的对象的引用计数。在代码中有6个对象:5个独立的整数,以及5个引用的列表(每个整数一个)。
for
循环的工作方式是对alist
中的每个元素执行一次循环体,i
在每次迭代中保存对alist
中不同元素的引用。i
引用的对象的引用计数至少为2:由alist
和i
本身持有的引用。当您调用del i
时,您只是通过使i
指向空值来减少其引用计数。虽然下面的 * 技术上 * 工作,通过删除所有(已知的)对象引用,它有自己的问题(涉及修改当前正在迭代的列表),不应该使用。
相反,只需使用列表解析来构建一个新列表来替换旧列表即可
tktrz96b4#
如果你真的想使用del,你需要在列表中使用它:
(note在这种情况下,
i
是一个索引,而不是你想要删除的值)但实际上,在这里你可能应该使用列表解析来创建另一个列表: