在字典推导式中使用locals()

10
下面的代码无法工作,我认为是因为推导式中的 locals() 变量会引用嵌套块,而推导式是在其中评估的:
def f():
    a = 1
    b = 2
    list_ = ['a', 'b']
    dict_ = {x : locals()[x] for x in list_}

我可以使用globals()代替,这似乎可行,但这可能会带来一些其他问题(例如,如果有一个来自周围作用域的同名变量)。

有什么方法可以精确地在函数f的范围内使用变量并将其放入字典中吗?

注意:我这样做是因为我有很多变量想要稍后放入字典中,但同时又不想使代码复杂化,所以不想写dict_['a']而是暂时使用a

2个回答

8
您可以尝试这样做:

您或许可以采取以下方法:

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    locals_ = locals()
    dict_ = dict((x, locals_[x]) for x in list_)

不过,我强烈反对使用locals()来实现这个目的。


我没有想到这个!为什么像这样使用locals()是不好的?我没有使用任何未记录的东西,对吧? - max
3
locals() 的使用可能会导致编译器在函数中生成不太优化的代码,但这并不是没有文档记录的问题。例如,如果编译器确定可以优化掉某些临时变量的使用(也许是函数中与您字典无关的其他变量),则如果函数中使用了 locals() ,它可能无法做到这一点。此外,通过避免首先创建字典,您需要重复(1)分配每个变量和(2)列表中的名称。 - Greg Hewgill
那我就卡住了:http://stackoverflow.com/questions/4067463/alternative-to-locals-in-printing-a-table-with-a-header - max

5
我相信你说得对:字典推导式中的 locals() 将指向推导式的命名空间。
可能的一种解决方案(如果你还没有想到):
f_locals = locals()
dict_ = {x : f_locals[x] for x in list_}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接