迭代创建变量:globals()的安全替代方案是什么



在关于迭代创建变量的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'])

不是,这样使用varslocals是不安全的。来自文件:

vars:

如果没有参数,vars()的行为与locals()类似。注意,locals字典只对读取有用,因为locals字典的更新被忽略。

locals:

注意:此字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

locals的情况下,可以对该注释进行解释,即不应更改返回字典中现有的内容(而不是引入新内容(。尽管如此,文档中没有任何内容表明在字典中引入新值应该有任何效果。

相关内容

  • 没有找到相关文章

最新更新