需要帮助理解来自PEP 227和Python Language Reference
的以下句子如果在封闭范围内引用变量,则会出错 删除名称。编译器将为'del'引发一个SyntaxError 名”。
缺少示例导致我无法在编译时重现错误,因此非常需要使用示例进行解释。
答案 0 :(得分:17)
以下提出了这个问题:
def foo():
spam = 'eggs'
def bar():
print spam
del spam
因为spam
变量正在bar
:
>>> def foo():
... spam = 'eggs'
... def bar():
... print spam
... del spam
...
SyntaxError: can not delete variable 'spam' referenced in nested scope
Python检测到spam
中正在引用bar
但未向该变量分配任何内容,因此它会在foo
的周围范围内查找。 分配在那里,使del spam
语句出现语法错误。
Python 3.2中删除了此限制;您现在负责不自行删除嵌套变量;您将收到运行时错误(NameError
):
>>> def foo():
... spam = 'eggs'
... def bar():
... print(spam)
... del spam
... bar()
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in foo
File "<stdin>", line 4, in bar
NameError: free variable 'spam' referenced before assignment in enclosing scope
答案 1 :(得分:5)
可以是一个例子:
>>> def outer():
... x = 0
... y = (x for i in range(10))
... del x
...
SyntaxError: can not delete variable 'x' referenced in nested scope
基本上它意味着你不能删除内部块中使用的变量(在这种情况下是genexp)。
请注意,这适用于python&lt; = 2.7.x和python&lt; 3.2。 在python3.2中,它不会引发语法错误:
>>> def outer():
... x = 0
... y = (x for i in range(10))
... del x
...
>>>
有关更改的全部内容,请参阅this链接。
我认为python3.2 semanthics更正确,因为如果你在函数外部编写相同的代码它会起作用:
#python2.7
>>> x = 0
>>> y = (x for i in range(10))
>>> del x
>>> y.next() #this is what I'd expect: NameError at Runtime
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
NameError: global name 'x' is not defined
将相同的代码放入函数中时,不仅会更改异常,而且错误发生在编译时。