2016-11-25 94 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

相關問題