2010-10-13 46 views
2

我正在學習Python並剛剛有這個問題。它可能沒有實際價值,我可能是因爲一種迂腐的好奇心而問這個問題。恢復「全球<var>」聲明

我有一個函數:

def f(): 
    x = 12 #this is a local variable 
    global x #this is a global I declared before 
    x = 14 #changes global x 

    <How can I return the local x?> 

我知道,這是醜陋,我得到一個語法警告。只是想知道如何「取回」我的本地變量。

感謝大家。

回答

7

你的代碼沒有做你認爲的事情,也沒有辦法改變它做你所描述的。您不能「恢復」globals的功能,因爲它在運行時無效。

global關鍵字在解釋編譯時間所以在f()第一線,您可以設置x = 12這是改變全球x因爲編譯器決定了xx在全局命名空間在整個功能,而不僅僅是在global聲明之後。

您可以輕鬆地測試:

>>> def g(): 
...  x = 12 
...  y = 13 
...  global x 
...  print "locals:",locals() 
... 
<stdin>:4: SyntaxWarning: name 'x' is assigned to before global declaration 
>>> g() 
locals: {'y': 13} 

locals() function給我們當地的命名空間的視圖,我們可以看到,有在沒有x

The documentation says the following

global語句中列出名稱不能在同一碼塊以文本前述那global語句中使用。

global語句中列出名稱不能被定義爲正式的參數或在for環控制目標,class定義,函數定義,或import語句。

當前的實現不強制執行後兩種限制,但程序不應該濫用這種自由,因爲未來的實現可能強制執行它們或者默默地改變程序的含義。

只給本地變量一個不同的名字。

4

我非常懷疑它可以做到。

>>> x = 1 
>>> def f(): 
...  x = 12 
...  global x 
...  print x 
... 
<stdin>:3: SyntaxWarning: name 'x' is assigned to before global declaration 
>>> f() 
12 
>>> x 
12 

正如你可以看到,即使沒有global關鍵字後明確分配給x,蟒蛇同步了兩個值。爲了明白爲什麼,你必須拆卸它。

>>> dis.dis(f) # different f with print statement removed for clarity 
    2   0 LOAD_CONST    1 (12) 
       3 STORE_GLOBAL    0 (x) 

    3   6 LOAD_CONST    0 (None) 
       9 RETURN_VALUE   
>>> 

global關鍵字是不是在這裏代表所有,但賦值語句被編譯爲STORE_GLOBAL。完成後,就完成了。小心謹慎使用全局變量和global關鍵字。

+0

+1刪除我自己的帖子,因爲這解釋得很好。 – pyfunc 2010-10-13 08:28:57

+0

你真了不起。謝謝。 – Learner 2010-10-13 08:30:19

1

無法取消global語句的效果。

A global聲明適用於函數出現的整個持續時間,而不管函數在哪裏,也不管它是否被執行。因此,例如,在以下功能中的分配:

def f(): 
    x = 3 
    if False: 
     global x 

x仍被視爲全局。

因此,之後有另一個語句撤銷其效果是沒有意義的,因爲global「語句」不是一個聲明,它是在函數期間的某個點執行的,作爲關於行爲的聲明作爲一個整體的功能。