python - `x = 42; x = lambda: x` 已解析?
问题描述
我很惊讶这个断言失败了:
x = 42
x = lambda: x
assert x() == 42
似乎x
最终以递归方式引用自身,因此x()
,x()()
等都是函数。
用于解析这个的规则是什么,这个记录在哪里?
顺便说一下(上面没有意外地给出),原始值x
在 lambda 定义之后没有留下任何引用:
class X:
def __del__(self): print('deleting')
x = X()
x = lambda: x # 'deleting' is printed here
解决方案
该变量x
由第一个赋值创建,并与第二个赋值重新绑定。
由于x
在调用 lambda 之前不会评估 lambda 中的 ,因此调用它将评估为最近分配的值。
请注意,这不是动态范围 - 如果它是动态的,则以下将打印“99”,但它会打印“<function ...”:
x = 42
x = lambda: x
def test(f):
x = 99
print(f())
test(x)
推荐阅读
- apache-poi - 无法加载类 'org.apache.poi.xssf.streaming.SXSSFWorkbook'
- c++ - 如何访问另一个函数中的局部变量?
- hadoop - Mapreduce 过滤数据
- python - PyQt5树模型:同层内从后往前拖拽的拖拽问题
- mysql - 通过 res.redirect() 发送变量
- python-3.x - 当它说谷歌没有验证这个应用程序时,如何通过python从谷歌驱动器中读取文件?
- javascript - 节点 json-2-csv - 如何选择标题?
- python - 我的机器人没有检查条件,只是一次又一次地接受输入
- sql - Oracle SQL - 根据操作和日期派生用户状态
- android - Flutter Webview Url 管理