python-3.x - 引入 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)第二版应该运行没有错误还是应该崩溃?)
解决方案
以下帖子为我解决了这个问题:
https://amir.rachum.com/blog/2013/07/09/python-common-newbie-mistakes-part-2/
我想强调:
“第一个误解是 Python,作为一种解释性语言(这很棒,我想我们都同意),是逐行执行的。事实上,Python 是逐语句执行的。感受一下我的意思是,转到你最喜欢的 shell(我希望你没有使用默认的 shell)并输入以下内容:
def foo():
按 Enter。如您所见,shell 没有提供任何输出,它显然在等待您继续定义函数。”
这是我困惑的根源。
感谢@norok2 将我指向一个指向我的帖子。
也很有帮助)
推荐阅读
- ionic-framework - Ionic 3 col-* 属性仅分区 6
- javascript - 检查 div 值并更新 React 中的类
- java - 如何解析地图对象
从 Google Cloud Firestore 的 documentSnapshot.getData() 返回到 POJO? - html - 如何将此表格准确对齐在持有表格的分区的中心?
- java - 如何为未知数量的线程设置倒计时
- javascript - Onclick 在第三方表单 iframe 中填写表单字段
- networking - Netplan 错误:无法绑定到端口 2893,地址已在使用中
- html - 由于未知原因,圆锥梯度 css 在 React 中不起作用
- mysql - MySQL 左/右/外连接
- python - 使用 Django 的 ORM 聚合 OneToMany 关系中不同日期的数量