代码之家  ›  专栏  ›  技术社区  ›  jason

根据变量名列出列表

  •  0
  • jason  · 技术社区  · 6 年前

    我正试图通过匹配字符串来创建一个列表列表 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 回复  |  直到 6 年前
        1
  •  1
  •   Seth Difley    6 年前

    实现目标的最小变化是 vars() 具有 vars().copy() . 变量() 迭代for循环时发生更改。 a = vars() 创建别名 变量() . 自从 a 是的别名 变量() , 会改变如果 变量() 变化。当您循环使用的字典发生更改时,python将抛出异常。副本 变量() 是用 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])
    

    证明这一点 变量() 当程序循环通过 for 循环,放置 print(vars()) 在里面 对于 循环并注意 变量() 每次迭代都不同。

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