在字典理解中使用locals()

max*_*max 5 python list-comprehension python-3.x

下面的代码不起作用,我假设因为理解中的locals()变量将引用嵌套块,其中评估了理解:

def f():
    a = 1
    b = 2
    list_ = ['a', 'b']
    dict_ = {x : locals()[x] for x in list_}
Run Code Online (Sandbox Code Playgroud)

我可以使用globals(),它似乎工作,但这可能会带来一些额外的问题(例如,如果有一个来自周围范围的变量恰好具有相同的名称).

有没有什么能使字典在函数范围内精确地使用变量f

注意:我这样做是因为我有许多变量,我希望稍后将其放入字典中,但不希望通过编写dict_['a']而不是a在此期间使代码复杂化.

Gre*_*ill 8

你也许可以这样做:

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

但是,我强烈反对locals()为此目的使用 。

  • 它并非未记录在案,但使用 `locals()` 可能会触发编译器为引用它的函数生成次优代码。例如,如果编译器确定它可以优化一些临时变量的使用(可能是函数中与您的字典无关的一些 *other* 变量),如果使用 `locals()`,它可能无法做到这一点函数内。此外,通过避免首先创建字典,您会重复 (1) 每个变量的赋值,以及 (2) 列表中的名称。 (3认同)

Dav*_*ver 5

我相信你是对的:locals()字典理解的内部将引用理解的名称空间。

一种可能的解决方案(如果您还没有想到):

f_locals = locals()
dict_ = {x : f_locals[x] for x in list_}
Run Code Online (Sandbox Code Playgroud)