根据变量名列出列表

时间:2018-07-28 03:12:48

标签: python list

我正在尝试通过匹配字符串zz

来创建列表列表
zza=[1,1,1]
zzb=[2,2,2]
zzc=[3,3,3]

final=[]

a= vars()

for i in a:
    if 'zz' in i:
        final.append(a[i])

得到此错误RuntimeError: dictionary changed size during iteration

所需的输出:final = [[1,1,1],[2,2,2],[3,3,3]]

基本上,我要完成的工作是使代码根据我设置的变量自动使我成为列表。因为我会有很多,并且不想每次添加这样的另一个列表时都手动附加final

final =[zza,zzb,zzc]等...

1 个答案:

答案 0 :(得分:1)

将完成目标的最小更改是将vars()替换为vars().copy()。当您遍历for循环时,vars()会发生变化。 a = vars()vars()创建别名。由于avars()的别名,因此如果a更改,vars()也会更改。当您循环的字典发生变化时,python会引发异常。用vars()创建的vars().copy()的副本在程序执行时不会更改。

zza = [1,1,1]
zzb = [2,2,2]
zzc = [3,3,3]

final = []

a = vars().copy()

for i in a:
    if 'zz' in i:
        final.append(a[i])

要证明vars()随着程序在for循环中的变化而变化,请将print(vars())放在for循环中,请注意vars()对于每次迭代。

有关变量分配在python中如何工作的更多信息,请阅读https://docs.python.org/3.7/library/copy.html。要点是a = b不会创建b的副本。相反,ab是同一对象的名称(或别名)。 python使用现有对象有意义的一个原因是,创建对象的副本会占用更多的内存和处理时间。