我正在尝试通过匹配字符串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]
等...
答案 0 :(得分:1)
将完成目标的最小更改是将vars()
替换为vars().copy()
。当您遍历for循环时,vars()
会发生变化。 a = vars()
为vars()
创建别名。由于a
是vars()
的别名,因此如果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
的副本。相反,a
和b
是同一对象的名称(或别名)。 python使用现有对象有意义的一个原因是,创建对象的副本会占用更多的内存和处理时间。