2024-04-19 12:09:28 发布
网友
我有以下片段:
a, b = 1, 2 params = ['a', 'b'] res = {p: vars()[p] for p in params}
这给了我KeyError: 'a',而下面的代码可以正常工作:
KeyError: 'a'
这有什么区别?在
Python似乎在字典理解中实现了一个闭包(比如,dictcomp)
dictcomp
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <dictcomp> KeyError: 'a'
{/strong>返回的本地代码变量。实际上根据文件:
Without an argument, vars() acts like locals() .
请参见以下示例:
>>> def a(): ... print vars() ... >>> a() {}
如您所见,函数a中没有任何局部变量,因此vars返回一个空字典。在
a
在您的例子中,作为一种更具Python式的方式,您可以创建一个对象字典:
没有任何参数的^{}与locals()相似,因为字典理解有自己的作用域,因此没有名为a或{}的变量。在
locals()
您可以在这里使用^{}。不带任何参数,它将以LEGB方式执行,或显式地将globals()dict指定为eval:
globals()
eval
>>> res = {p: eval(p) for p in params} >>> res {'a': 1, 'b': 2}
但是,正确的方法是从一开始就创建一个字典,如果你想用变量的名字来访问变量。在
Python似乎在字典理解中实现了一个闭包(比如,
dictcomp
){/strong>返回的本地代码变量。实际上根据文件:
请参见以下示例:
如您所见,函数
a
中没有任何局部变量,因此vars返回一个空字典。在在您的例子中,作为一种更具Python式的方式,您可以创建一个对象字典:
^{pr2}$没有任何参数的^{} 与}的变量。在
locals()
相似,因为字典理解有自己的作用域,因此没有名为a
或{您可以在这里使用^{} 。不带任何参数,它将以LEGB方式执行,或显式地将
globals()
dict指定为eval
:但是,正确的方法是从一开始就创建一个字典,如果你想用变量的名字来访问变量。在
相关问题 更多 >
编程相关推荐