如何在Python中创建一个创建多个空列表的循环?

如何在Python中创建一个创建多个空列表的循环?,python,list,loops,dictionary,Python,List,Loops,Dictionary,我想要一行代码,它将创建一个由递增变量确定名称的空列表 到目前为止,我所看到的每一个地方都无济于事。相反,他们建议做一个空列表或使用字典。这不是我想要的,我想要一行(或几行)代码,只创建一个空列表(它不是字典或列表列表的一部分,一个独立实体)。我希望这些列表是不同的,通过一个变量来区分,该变量在每次创建新的空列表时递增1 这些空列表不能在一开始就在一批中生成,因为我打算在整个递归函数中生成和删除这些列表。我需要创建多个列表,因为我的目的是让这个函数下降到一个新的递归级别,但稍后返回到上一个列表。

我想要一行代码,它将创建一个由递增变量确定名称的空列表

到目前为止,我所看到的每一个地方都无济于事。相反,他们建议做一个空列表或使用字典。这不是我想要的,我想要一行(或几行)代码,只创建一个空列表(它不是字典或列表列表的一部分,一个独立实体)。我希望这些列表是不同的,通过一个变量来区分,该变量在每次创建新的空列表时递增1

这些空列表不能在一开始就在一批中生成,因为我打算在整个递归函数中生成和删除这些列表。我需要创建多个列表,因为我的目的是让这个函数下降到一个新的递归级别,但稍后返回到上一个列表。它们充当临时工作列表,为原始列表的每个项目计算一个值,然后在找到结果后将其复制到最终列表中

str("list_" + i) = []
如果i=1,那么我希望这行代码创建一个名为“list_1”的空列表,我可以在整个脚本中继续与之交互

相反,我遇到了
“SyntaxError:cannotassigntofunctioncall”


无论如何,如果我没有任何意义,请告诉我,我会尽力表达我的要求。

强烈建议不要这样做,但这会根据您的使用情况实现您想要的:

globals()['list_' + str(i)] = []

for i in range(5):
    globals()['list_' + str(i)] = []

list_1
[]

list_2
[]

etc...
根据您的用例,切换
全局变量
,切换
局部变量
,反之亦然

更好的办法是
defaultdict

from collections import defaultdict

my_lists = defaultdict(list)
现在,您不必初始化任何列表,直到您使用它,并且每个键的值都已经是一个
列表
。例如:

for i in range(5):
    my_lists['list_' + str(i)].append('foo')

my_lists

defaultdict(list,
            {'list_0': ['foo'],
             'list_1': ['foo'],
             'list_2': ['foo'],
             'list_3': ['foo'],
             'list_4': ['foo']})

这是不好的做法,但无论如何:

for i in range(10):       # for global vars
    globals()["list_" + str(i)] = []
print(list_0) # []
也许你要找的是一本字典:

items = dict()
for i in range(10):       # for dictionary 
    items[str("list_" + i)] = []
print(items.list_0) # []
避免使用
globals
,使用
defaultdict
使用a既高效又易于管理。添加到列表值时,不需要显式添加键:

from collections import defaultdict
dd = defaultdict(list)
dd['list_0'].append('foo')

print(dd)
# defaultdict(<class 'list'>, {'list_0': ['foo']})
从集合导入defaultdict
dd=默认DICT(列表)
dd['list_0'].追加('foo')
印刷品(dd)
#defaultdict(,{'list_0':['foo']})
如果要显式添加键,即使列表值为空,也可以通过输入一个额外参数来实现:

from collections import defaultdict
dd = defaultdict(list, **{k: [] for k in [f'list_{i}' for i in range(5)]})

print(dd)
# defaultdict(<class 'list'>, {'list_0': [], 'list_1': [], 'list_2': [],
#                              'list_3': [], 'list_4': []})
从集合导入defaultdict
dd=defaultdict(list,**{k:[]表示范围(5)]中i的[f'list_{i}'中的k)
印刷品(dd)
#defaultdict(,{'list_0':[],'list_1':[],'list_2':[],
#'列表3':[],'列表4':[]}

你知道人们建议你想要的东西以外的东西是有原因的吗?你想要一个数量可变的变量(这是重复的),它只会产生可怕的代码,无法正确地遵循。老实说,
defaultdict(list)
听起来很理想,即使你说不是。虽然这种方法在技术上可能是可行的,但我建议不要。有更简单的方法来获取列表。我假设您是一名新的Python开发人员,在这种情况下,欢迎!听起来你想要的东西不太方便管理。我不认为这是个好主意,我强烈建议为此使用字典。你确定你的递归算法不能只处理局部变量中的列表吗?如果在函数体中执行类似于
local\u list=[]
的操作,则每次调用函数时都会创建一个单独的空列表。它不会与其他调用共享列表,无论是更早还是更晚,除非您编写代码让它这样做。处理局部变量比使用全局变量要好得多。这是我所见过的Python问题中最不具Python风格的正确答案。强烈建议使用
defaultdict
解决方案!非常确定代码会以循环的方式向您展示如何做到这一点是的,我很笨,不必担心问了一个愚蠢的问题。在我看来,
globals
解决方案应该被删除或降级为注释。实际上,
defaultdict
是唯一推荐的解决方案。这在几个方面是不正确的<代码>项目[str(“list_“+i)]=[]但是
项目
不存在,这是一个打字错误,我不理解
MyClass
的意义,因为它甚至没有正确定义1。如何设置全局属性2。如何设置对象属性3。为什么你可能想使用字典。当然,如果你没有对象,就不要使用对象,也许我应该做一个ClearRok,那么完全无效的代码是怎么做的?这只是抛出错误。这是误导,我完全删除它,感谢反馈