我对Python中变量赋值的理解是,当你执行a = 1
时,解释器会分配一些内存,存储数字1,然后a
是对该数字的引用。为什么会发生以下情况:
a = 1
b = 1
a is b
#True
另一方面:
a = 1.
b = 1.
a is b
#False
发生了什么事?我希望这两个语句都能评估为False
答案 0 :(得分:2)
解释器不必分配一些内存并创建一个1
值,如果它已经有一个可以使用的值。只要值是不可变的,也就是说,但是int在Python中是不可变的。
CPython碰巧预先创建了一系列小整数的值。几十年来确切的范围已经改变了几次(并且可以在构建时配置),但显然任何“小整体”的集合都将包括1
。
这种预创建不会发生在CPython中,浮点数,大型整数或非空元组或字符串 - 但它们无论如何都最终完全相同。特别是,如果编译器在同一个编译单元中看到相同的值两次,对于它知道不可变的类型,它可以合并它们。您通常只在模块常量中看到这个,而不是在交互式解释器中,因为交互式地,每个语句都是一个单独的编译单元。但是:
>>> a = 1.0
>>> b = 1.0
>>> a is b
False
>>> c, d = 1.0, 1.0
>>> c is d
True
不同的Python实现可能会以不同的方式执行。 (在CPython中还有另外一个技巧,即字符串实习,在3.4及更高版本中猜测结果可能更复杂。)
外卖是:
如果您发现自己使用带有int,string或任何其他开放式不可变类型的is
,那么您可能做错了什么。 (当然,或者故意探索你的翻译是如何运作的。)