如何使用for循环删除多个全球分配的列表



如果我有这些列表(现实中更大)

listSEG00 = ['n', 'n', '4', '3', 'w']
listSEG01 = ['4', '4', '4', '4', '4']
listSEG02 = ['l', 'l', 'l', 'l', 'l']
listSEG03 = ['5', 'l', '5', '8', '7']
listSEG04 = ['f', 'f', 'f', 'f', 'f']
listSEG05 = ['-', '-', '-', '-', '-']
listSEG06 = ['l', 'l', 'l', 'l', 'l']
listSEG07 = ['l', 'l', 'l', 'l', 'l']
listSEG08 = ['7', '4', '3', '8', '4']
listSEG09 = ['e', 'x', 'p', '9', 'm']

如何一次删除其中的许多?

我到目前为止有一个:

for y in range(0, 10):
    if len(set(eval('listSEG%i' % y))) == 1:
        del eval('listSEG%i' % y)

我在第三行上出现错误。

SyntaxError: can't delete function call

所以我显然没有做对。

评论员建议您将其保留在dict或不担心删除它们中,但是,您确实具有这种能力。

模块级变量可以从globals()返回的字典中删除:

>>> listSEG00 = ['n', 'n', '4', '3', 'w']
>>> listSEG01 = ['4', '4', '4', '4', '4']
>>> listSEG02 = ['l', 'l', 'l', 'l', 'l']
>>> listSEG03 = ['5', 'l', '5', '8', '7']
>>> listSEG04 = ['f', 'f', 'f', 'f', 'f']
>>> listSEG05 = ['-', '-', '-', '-', '-']
>>> listSEG06 = ['l', 'l', 'l', 'l', 'l']
>>> listSEG07 = ['l', 'l', 'l', 'l', 'l']
>>> listSEG08 = ['7', '4', '3', '8', '4']
>>> listSEG09 = ['e', 'x', 'p', '9', 'm']
>>> for i in globals().keys():
...     if i.startswith('list'):
...         del globals()[i]
...
>>> globals()
{'i': '__doc__', '__builtins__': <module '__builtin__' (built-in)>, '__package__
': None, '__name__': '__main__', '__doc__': None}
>>> listSEG00
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'listSEG00' is not defined

del是一个语句。它具有特殊的语法。本质上,您只能使用可以放在作业左侧的表达式(=)。而且您无法分配到诸如eval()的函数调用。

del name不会删除name所指的值。它只是链接名称。如果没有其他提到该对象,那么垃圾收集器稍后可能会将其删除。另请参见 @user2357112的评论。您可以将列表清空:

#XXX don't use it, see alternatives at the end of the answer
for y in range(10): 
    del eval('listSEG%02d' % y)[:] # empty the list

如果名称是该函数本地的,则在您离开功能后将自动删除它们。否则,您可以从适当的名称空间中删除它:全局(如@Aaron Hall所示),hindin,对象的__dict__

#XXX don't use it, see alternatives at the end of the answer
namespace = globals()
for y in range(10):
    del namespace['listSEG%02d' % y] # remove the name

如果您发现自己创建了可变名称,例如listSEG00listSEG01等,则应停止并使用列表(如@falsetru所建议)或词典在您的情况下更合适。在这种情况下,您可以执行:del listSEG,以删除一个指嵌套列表或字典的单个名称。

相关内容

  • 没有找到相关文章

最新更新