在下面的示例中,Python在内存中为名称空间中的所有三个名称x,y和z使用相同的整数对象
def main():
x = 0
y = 0
z = 0
print(x,y,z)
print(x is y is z)
y = 2
print(x,y,z)
print(x is y)
print(z is y)
print(x is z)
if __name__ == "__main__":main()
输出:
0 0 0
True
0 2 0
False
False
True
为什么Python在这里没有使用相同的元组对象(是的,它是语言设计者的选择,但为什么),更好的问题是当python在内存中创建新对象时
def main():
a = 1, 2, 3
b = (1, 2, 3)
c = 1, 2, 3
print(type(a) == type(b))
print(a == b)
print(a is b)
print(a == c)
print(a is c)
if __name__ == "__main__":main()
输出:
True
True
False
True
False
答案 0 :(得分:2)
对于表示可变对象的文字,文字的每次评估都必须生成一个新对象。
对于表示不可变对象的文字,是否创建新对象归结为任意实现细节。它本可以选择使用相同的元组。它可以在将来的版本中使用相同的元组,或者在不同的Python实现中使用。如果您反复调用main
,但a
,b
和c
的元组不同,那么您的示例会重复使用元组。你不应该以这种或那种方式依赖它。
如果你想看到这种情况的特定实现细节,CPython bytecode compiler通常会在代码对象中将等效常量合并在一起(该机制涉及一个dict,还有一些额外的工作来保存{{1}并且1.0
来自合并),但预先计算3个元组的peephole optimization pass发生在没有重复数据删除机制的后处理阶段。