当python在内存中创建新对象时

时间:2017-08-18 19:17:32

标签: python variable-assignment python-internals

在下面的示例中,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

1 个答案:

答案 0 :(得分:2)

对于表示可变对象的文字,文字的每次评估都必须生成一个新对象。

对于表示不可变对象的文字,是否创建新对象归结为任意实现细节。它本可以选择使用相同的元组。它可以在将来的版本中使用相同的元组,或者在不同的Python实现中使用。如果您反复调用main,但abc的元组不同,那么您的示例重复使用元组。你不应该以这种或那种方式依赖它。

如果你想看到这种情况的特定实现细节,CPython bytecode compiler通常会在代码对象中将等效常量合并在一起(该机制涉及一个dict,还有一些额外的工作来保存{{1}并且1.0来自合并),但预先计算3个元组的peephole optimization pass发生在没有重复数据删除机制的后处理阶段。