python和引用中的变量赋值

时间:2018-03-25 02:42:44

标签: python python-3.x

我对Python中变量赋值的理解是,当你执行a = 1时,解释器会分配一些内存,存储数字1,然后a是对该数字的引用。为什么会发生以下情况:

a = 1
b = 1
a is b
#True

另一方面:

a = 1.
b = 1.
a is b
#False

发生了什么事?我希望这两个语句都能评估为False

1 个答案:

答案 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,那么您可能做错了什么。 (当然,或者故意探索你的翻译是如何运作的。)