如何在Python的for循环中为一组变量分配值?
解决思路与实现方法
首先明确:你最初的一次性赋值lst = [one, two, three] = [i for i in range(1,4)]能生效,是因为Python先执行右侧生成列表[1,2,3],然后同时完成解构赋值(把1、2、3分别给one、two、three)和列表赋值(把这个列表给lst)——这时候one、two、three是被直接赋值的,所以不会报错。但单独写lst = [one, two, three]时,one、two、three还没定义,自然会抛出NameError。
要在循环里实现「列表元素和独立变量同步更新」的效果,有两种可行方案:
方案一:用可变类型包装变量(推荐)
Python里不可变类型(比如int、str)的赋值是创建新对象,直接修改列表元素不会同步到独立变量。用单元素列表这种可变类型包装后,列表里存的是包装对象的引用,修改内部值就能同时同步:
# 初始化:用单元素列表包装每个变量 one = [0] two = [0] three = [0] lst = [one, two, three] # 循环中赋值,同时更新变量和列表 for count, i in enumerate(range(1,4)): lst[count][0] = i # 验证:两种访问方式结果一致 print(one[0]) # 输出1 print(lst[0][0]) # 输出1
方案二:动态操作命名空间(不推荐)
通过locals()或globals()直接修改当前作用域的变量,虽然能实现需求,但会降低代码可读性,还容易引发意外问题:
# 定义需要绑定的变量名列表 var_names = ['one', 'two', 'three'] # 初始化变量和列表 lst = [] for name in var_names: locals()[name] = 0 lst.append(locals()[name]) # 循环赋值 for count, i in enumerate(range(1,4)): target_var = var_names[count] locals()[target_var] = i lst[count] = i # 验证 print(one) # 输出1 print(lst[0]) # 输出1
补充说明
如果你不需要变量和列表实时同步,只是想在循环结束后同时得到列表和对应变量,也可以在循环结束后再做一次解构赋值:
lst = [] for i in range(1,4): lst.append(i) one, two, three = lst print(one) # 输出1 print(lst[0]) # 输出1
内容的提问来源于stack exchange,提问作者Andrew Anderson
相关产品推荐
相关产品推荐

