簡體   English   中英

Python:使用vars()字典時的問題

[英]Python: issue when using vars() dictionary

我有以下代碼段:

a, b = 1, 2
params = ['a', 'b']
res = {p: vars()[p] for p in params}

這給了我KeyError: 'a'而下面的代碼工作正常:

a, b = 1, 2
params = ['a', 'b']
res = {}
for p in params:
    res[p] = vars()[p] 

這有什么區別?

沒有任何參數的vars()就像locals() ,因為字典理解有自己的范圍,所以沒有名為ab變量。

你可以在這里使用eval() 沒有任何參數,它將以LEGB方式執行,或者明確指定為eval globals() dict:

>>> res = {p: eval(p) for p in params}
>>> res
{'a': 1, 'b': 2}

但是,如果您想使用名稱訪問變量,那么正確的方法是從頭開始創建字典。

它是因為,在你的代碼vars返回一個字典包含基於文件的本地 variables.actually:

沒有參數, vars()就像locals()一樣

請參閱以下示例:

>>> def a():
...   print vars()
... 
>>> a()
{}

正如你可以看到我們有沒有內部功能的局部變量a如此瓦爾返回一個空的字典。

在您的情況下,作為一種更加pythonic的方式,您可以創建對象的字典:

d={'a':1,'b': 2,'params' : ['a', 'b']}
example_list : ['a', 'b']
res = {p: d[p] for p in example_list}

似乎Python在字典理解中做了一個閉包(比方說, dictcomp

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
KeyError: 'a'

在for循環中使用vars()作為您給出的第二個代碼。

# come out with {'a': 1, 'b': 2}
res = {p: v for p, v in vars().iteritems() if p in params}
res = {'a': vars()['a'], 'b': vars()['b']}

我們可以在dict理解中找出for循環中的新locals/vars

>>> {i: list(vars().viewkeys()) if i == 0 else list(vars().viewvalues()) for i in range(2)}
{0: ['i', '.0'], 1: [1, <listiterator at 0x6fffe458550>]}
>>> {list(vars().viewkeys())[i]: list(vars().viewvalues())[i] for i in range(2)}
{'.0': <listiterator at 0x6fffe458710>, 'i': 0}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM