2016-11-25 76 views
3

Python的locals()文件说:Python的locals()是做什么的?

更新,并返回来表示当前本地符号表的字典。在功能块中调用自由变量时,返回locals(),但不在类块中调用。

  1. 什么是正是当前局部符号表?

  2. 如果在函数的开头调用locals(),局部符号表是否保证与参数字典相同?

    例如,如果我们有如下的程序:

    def foo(x, y): 
        print(locals() == {'x': 1, 'y': 2}) 
    foo(1, 2) 
    

    请问它总是输出True无论我们使用什么平台和Python实现?

+0

@idjaw这个问题根本没有提及*符​​号表*。 – Cyker

+0

@idjaw仅供参考我想将函数中的参数传递给另一个函数,但为了便于阅读,我不想将函数原型更改为'(* args,** kwargs)'。如果'locals()'与函数开头的参数dict完全相同,那么传递参数将非常容易。 – Cyker

+0

重新读你的问题我看到你所问的细节。我会删除以消除混淆。 – idjaw

回答

0

什么是正是当前局部符号表?

那么,你可以自己看看。在你的Python,程序非常beginging,这里是由locals()返回的符号表的样子:

print(locals()) 

,输出:

{'__doc__': None, '__spec__': None, '__package__': None, '__builtins__': 
<module 'builtins' (built-in)>, '__name__': '__main__', '__loader__': 
<class '_frozen_importlib.BuiltinImporter'>, 
'__file__': 'C:\\Users\\$Name$\\Desktop\\script.py'} 

符号表由几个“神奇变量”的,以及关于你当前的Python文件的一些信息。如__file__密钥,其中包含当前源文件的名称。什么当地人的说明返回几乎相匹配的定义为一个符号表:

在计算机科学中,符号表是由一个语言翻译器使用的数据结构,诸如编译器或解释,其中每个标识符在程序的源代码与其声明或外观在源中的相关信息相关联。 - Wikipedia: Symbol table

(重点煤矿)


保证是一样的参数字典,如果当地人()被调用的函数的最开始的局部符号表?

这个问题的答案会 。函数有自己的范围。而且,正如名称暗示的那样,locals()仅返回当前范围本地的标识符。因此,函数内部调用locals()不能被程序的外部范围所改变。例如。

>>> var = 10 # global variable 
>>> locals()['var'] # var is accessible in the current scope 
10 
>>> def func(): 
    print(locals()['var']) # but not in this scope. Python will raise an error 


>>> func() 
Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    func() 
    File "<pyshell#16>", line 2, in func 
    print(locals()['var']) 
KeyError: 'var' 
>>> 

它是一个有点难以完全明白你问的第二个问题,所以我很抱歉,如果我的回答是没有关系的。但我相信你的问题:如果我在我的功能开始时拨打locals(),在我的定义里面,保证保持不变的是当地人返回的dict()。如果情况并非如此,请更新您的问题,我会尝试重新回答。

+0

我不确定在参数以外的函数范围中是否会有一些内置名称。你能找到任何一个Python实现引用,说一个函数作用域在其开始时是干净的吗? – Cyker

+0

@Cyker在我回答之前,请确保它们在同一页面上。 **除了你的参数**之外,你在函数开头的地方是否有任何名字? –

+0

是的,我在问是否没有任何**额外的名字。 – Cyker