在Python(更具体地说是Python 3.x)中,如果我说x = x
会发生什么,其中x
是对可变的引用(如list
)或对int
的引用低级别的不可变(如class A:
def __init__(self):
self.a = self.init_a()
def init_a(self):
self.a = some_value
"""
do stuff with self.a here
"""
return self.a
)?编译器是否只是忽略了这些废话?
更具体地说,如果我们遇到以下情况,编译器会做什么:
self.a
对于那些没有注意到的人,init_a(self)
通过函数class A
有效地分配给自己。
我知道上面的__init__(self)
这个案例看起来很傻,但是我试图通过清楚地初始化boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v);
函数中的所有成员变量来保持我的代码清晰可读(在我不同的类中)我正在实施真实的)。我只想知道编译器是否优化了这一步,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果(我猜它会被优化掉,但我想成为当然 - 你永远不知道。)
答案 0 :(得分:5)
from dis import dis
def foo():
x = 1
x = x
dis(foo)
结果:
4 0 LOAD_CONST 1 (1)
3 STORE_FAST 0 (x)
5 6 LOAD_FAST 0 (x)
9 STORE_FAST 0 (x)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
这表明即使在最微不足道的情况下,x = x
也没有被优化掉(在CPython中,这是dis
的用途)。
答案 1 :(得分:1)
我只是想知道编译器是否优化了这一步骤,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果。
除非Python语言参考说明了 1 ,否则任何优化或缺少它都是特定于实现的 2 。您可以研究特定的Python实现对此做了什么,但不能概括为所有Python实现。
1 - 我粗略搜索规范的this copy并不是对优化的任何相关讨论。因此,我的解读是允许有效的优化,但不是必需的。 (有效的优化将不会改变规范明确要求的有效Python程序的任何可观察行为。)
2 - 确实规范说明了这一点:"这些实现中的每一个[在规范中上面列出]在某种程度上与本手册中记录的语言有所不同,或者介绍 超出标准Python文档所涵盖的特定信息。请参考实施 - 特定文档,以确定您需要了解的有关您正在使用的具体实现的其他内容。"
答案 2 :(得分:1)
这看起来很奇怪,但实际上不可能实现你建议的优化,因为python太动态了。
请考虑以下代码:
[Definition of your A class]
@property
def sneaky(self):
return self._a
@sneaky.setter
def sneaky(self, value):
self._a = value * 2
A.a = sneaky
a = A()
self.a =
方法中的__init__
突然开始产生效果!它使a的价值翻倍。 Python确实很有活力。