2017-11-11 152 views
0

this paragraph,人們可以找到下面這句話(我的重點):Python的參考語言:外地定義

名在外地聲明中列出的,不像那些在全球聲明中列出的,必須引用預先存在在封閉範圍內綁定(應創建新綁定的範圍無法明確確定)。

我採取大膽-ED句話在括號解釋前一句的意思是爲了讓外地的語句,如nonlocal a是正確的,聲明如a = 1應該在什麼命名空間增加決定的問題(或修改)綁定,無論是在本地名稱空間還是在封閉名稱空間中(因爲存在已包含名稱爲a的綁定的名稱空間)。

這是正確的,是這樣的意圖?

如果是的話,我相信甚至對於全球性的案例(即括號內的措辭),「應該創建新綁定的範圍不能明確確定」也適用,這不是明確的。我對麼?

回答

2

語言參考是說外部範圍內的某些語句必須創建變量nonlocal來引用。例如,這是好的:

def f(): 
    def g(): 
     a = 3 
     def h(): 
      def i(): 
       nonlocal a 
       print(a) 

但這不是:

def f(): 
    def g(): 
     def h(): 
      def i(): 
       nonlocal a 
       print(a) 

因爲在第一個片段,Python可以告訴nonlocal應該從g功能使用a變量。在第二個片段中,Python必須在其中一個封閉函數中創建一個新的a變量,並且它不能分辨哪個變量。

+0

是的,我明白了,我認爲句子的第一部分清楚地說明了這一點:「在非本地聲明中列出的名稱,與全局聲明中列出的名稱不同,**必須指封閉中的預先存在的綁定範圍**」。我對這句話的其餘部分的正確性感到疑惑:「(創建新綁定的範圍不能毫不含糊地確定)」。 – user42768

+1

@ user42768:括號中的部分是說如果沒有現有的綁定,Python將不得不創建一個新的綁定,並且它不能告訴在哪裏做。 – user2357112

+0

我不明白你是怎麼得到的「一個像a = 1這樣的語句應該在決定添加(或修改)綁定的命名空間時遇到問題」。賦值語句不是非局部語句,並且不使用相同的規則。 – user2357112