【发布时间】:2012-11-22 15:43:55
【问题描述】:
我最近在 Python 中想到了一些事情:x = y(z) 等同于 x = y.__call__(z)。但是,测试似乎使该假设无效,并且还会导致 Python 的解释器崩溃。
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def ret(*args):
... return args
...
>>> ret(1, 2, 3)
(1, 2, 3)
>>> for _ in range(1000000):
... ret = ret.__call__
...
>>> ret(1, 2, 3)
运行第二个 ret(1, 2, 3) 会导致 Python 崩溃并返回命令提示符 (image)。
-
ret = ret.__call__行执行时后台发生了什么? - 为什么 Python 在最后一行停止工作,是否应该将其报告为错误?
【问题讨论】:
-
我无法在 2.7 或 3.2.3 中重现它。
-
你打错了吗?可能你的意思是
ret = ret.__call__(_) -
@akaRem:那根本行不通。
-
请定义“崩溃”。我可以使用 python2.7/3.2 和 3.3 在 Windows 上重现(我认为)。无论如何,每次你做
ret = ret.__call__你实际上是在创建一个新的方法包装实例,当调用最终执行时,解释器必须通过你刚刚创建的所有包装器,所以函数调用甚至需要永远启动(甚至虽然我认为它不应该花几分钟......至少,通常你可以在一分钟内完成数百万或更多的函数调用) -
某种确认:segmentation fault,尽管使用不同版本的 python。 3.2 本地相同。
标签: python testing attributes crash call