在关于迭代创建变量的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'])
不是,这样使用vars
或locals
是不安全的。来自文件:
vars
:
如果没有参数,
vars()
的行为与locals()
类似。注意,locals字典只对读取有用,因为locals字典的更新被忽略。
locals
:
注意:此字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。
在locals
的情况下,可以对该注释进行解释,即不应更改返回字典中现有的内容(而不是引入新内容(。尽管如此,文档中没有任何内容表明在字典中引入新值应该有任何效果。