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

问题描述 投票:0回答:1

在有关迭代创建变量的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()相反,却从未提及他们?

python global-variables global
1个回答
0
投票

分配给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'])

0
投票

不是,那样使用varsvars是不安全的。从文档中:

locals

没有参数,locals的作用类似于vars。注意,由于忽略了本地字典的更新,因此本地字典仅对读取有用。

vars

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

© www.soinside.com 2019 - 2024. All rights reserved.