2017-11-11 144 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