2017-07-13 60 views
2

https://docs.python.org/3/reference/executionmodel.html#resolution-of-names名稱解析給exec()和eval()

類去網絡nition是一個可執行語句可以使用和德科幻NE 名。這些引用遵循的一般規則的名稱 分辨率的例外是綁定局部變量是 在全局命名空間中擡起頭來。

什麼是「在全局命名空間中查找未綁定的局部變量」在這裏意味着什麼?一個類定義可以是內其他的類定義或函數定義,從而使未綁定局部變量的查找是不是在全局命名空間,但在局部範圍內築巢?

什麼是「一般規則」?

謝謝。

+0

你的鏈接提供了一個例子;在類「A」中,對「b」的賦值失敗,因爲列表理解使用定義爲類屬性的「a」,但不在全局範圍中。 – chepner

+0

的例子不回答我的問題,但解釋說點別的:「名稱的範圍去科幻類中的塊定義爲有限 到類模塊;它不會擴展到方法的代碼塊 - 這包括內涵和發電機 因爲它們是使用函數作用域實現的。「 – Tim

+0

'a'是生成器表達式中的一個未綁定的局部變量(不是列表理解,對不起,我的錯誤),但'class'語句不會創建一個作用域。因此,生成器的封閉作用域不是類,但是是全局範圍,所以''Aa'的賦值不會被生成器表達式看到。 – chepner

回答

0

拿這個例子:

x = 1 
def foo(): 
    x = 2 
    class Bar: 
     print(x) 
     x = 3 
foo() 
# Output: 1 

print()被調用時,x是本地的(因爲它的下一行分配),但仍然未綁定的,因爲它分配一個值之前,它的使用。

你可能想到的是,結合的x在最近的命名空間擡頭(這將是2),但在類塊,「綁定局部變量是在全局命名空間擡頭」,讓全球x是擡起頭,打印1


讓我們刪除裏面Bar分配:

x = 1 
def foo(): 
    x = 2 
    class Bar: 
     print(x) 
foo() 
# Output: 2 

現在,我們下面的「名稱解析的一般規則」,並得到輸出2,因爲裏面Barx不是本地了(這是一個免費變量),並在最近的封閉範圍擡起頭來。


另外,在本地命名空間中查找未綁定本地的規則是針對類的,而不是針對函數的。讓我們嘗試將其與功能:

x = 1 
def foo(): 
    x = 2 
    def bar(): 
     print(x) 
     x = 3 
    bar() 
foo() 
# Raises: UnboundLocalError: local variable 'x' referenced before assignment 

正如你所看到的,在功能,你不能給它分配一個值之前使用本地。