在有关迭代创建变量的S / O线程中,大多数答复建议使用globals()
,但要强调一个事实,即使用全局范围很危险。但是,locals()
和vars()
也可用于迭代创建变量。例如:
for i in range(1, 6):
vars()[f'variable_{i}'] = i
print(key for key in vars().keys() if 'variable' in key)
Out[2]: ['variable_1', 'variable_2', 'variable_3', 'variable_4', 'variable_5']
locals()
和vars()
可以安全地迭代创建变量吗?如果是这样,为什么与globals()
相反,却从未提及他们?
分配给vars
的输出实际上并没有修改本地作用域;它仅填充只能通过vars()
访问的映射。观察员:
>>> def bar():
... for i in range(6):
... vars()[f'var_{i}'] = i
... print(vars()['var_3'])
... print(var_3)
...
>>> bar()
3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in bar
NameError: name 'var_3' is not defined
由于您已经致力于映射语义,您也可以只使用dict
:
def bar():
data = {}
for i in range(6):
data[f'var_{i}'] = i
print(data['var_3'])