首页 > 解决方案 > 引入 del 关键字后解释行为的变化

问题描述

我写了以下玩具:

def foo():
    x = 5
    def foo2():
        print("Locals: ", locals())
        print("Vars: ", vars())
        print("dir: ", dir())
        print("CP 1")
        print("x =", x)
        print("CP 2")
        print("Locals: ", locals())
        print("Vars: ", vars())
        print("dir: ", dir())
    foo2()

foo()

print("-----------------------")

def foo():
    x = 5
    def foo2():
        print("Locals: ", locals())
        print("Vars: ", vars())
        print("dir: ", dir())
        print("CP 1")
        print("x =", x)
        print("CP 2")
        del x
        print("Locals: ", locals())
        print("Vars: ", vars())
        print("dir: ", dir())
    foo2()

foo()

产生以下输出:

Locals:  {'x': 5}
Vars:  {'x': 5}
dir:  ['x']
CP 1
x = 5
CP 2
Locals:  {'x': 5}
Vars:  {'x': 5}
dir:  ['x']
-----------------------
Locals:  {}
Vars:  {}
dir:  []
CP 1
Traceback (most recent call last):
  File "testing.py", line 34, in <module>
    foo()
  File "testing.py", line 32, in foo
    foo2()
  File "testing.py", line 26, in foo2
    print("x =", x)
UnboundLocalError: local variable 'x' referenced before assignment
>>> 

请注意第二版的行为是如何修改的,即使在两个版本相同的代码区域中(因此应该产生相同的结果)。由于 x,根据第一版,确实存在于本地命名空间中,因此 del 语句不应该成为问题。

问题:

1)第一版或第二版“正确”吗?x 是否应该存在于命名空间中?

2)这种行为是否有解释或者它是一个错误?

(跟进2:3)第二版应该运行没有错误还是应该崩溃?)

标签: python-3.xinterpreter

解决方案


以下帖子为我解决了这个问题:

https://amir.rachum.com/blog/2013/07/09/python-common-newbie-mistakes-part-2/

我想强调:

“第一个误解是 Python,作为一种解释性语言(这很棒,我想我们都同意),是逐行执行的。事实上,Python 是逐语句执行的。感受一下我的意思是,转到你最喜欢的 shell(我希望你没有使用默认的 shell)并输入以下内容:

def foo():

按 Enter。如您所见,shell 没有提供任何输出,它显然在等待您继续定义函数。”

这是我困惑的根源。

感谢@norok2 将我指向一个指向我的帖子。

https://docs.python.org/3.1/faq/programming.html?highlight=nonlocal#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

也很有帮助)


推荐阅读