【问题标题】:Python integer cachingPython整数缓存
【发布时间】:2016-11-07 19:28:13
【问题描述】:

在下面的 python 脚本中,为什么第二个断言会通过(即,当将 0 与 257 相加并将结果存储在 y 中时,x 和 y 成为不同的对象)?谢谢!

x = 257
y = 257
assert x is y

x = 257            
y = 257 + 0
assert x is not y

【问题讨论】:

  • 不要使用is 来检查相等性......基本上永远......它是内存位置变量......python 预存了少量的常量,它们恰好可以在其中工作某些情况...
  • 查看这个答案;它解释了为什么 is 有时工作起来很奇怪! stackoverflow.com/questions/132988/…

标签: python caching


【解决方案1】:

整数是不可变的,因此任何更改它们的操作都会导致新的内存位置

>>> a =9876
>>> id(a)
38478552
>>> a+=1
>>> id(a)
38478576
>>> a+=0
>>> id(a)
38478528

is 正在检查对象的实际内存位置......并且基本上不应该用于检查值是否相等(尽管它可能会在一些小部分情况下任意工作)

【讨论】:

    【解决方案2】:

    当您使用is 时,您正在检查两个对象是否指向相同的内存位置。如果他们这样做,那么结果是 True。否则,结果为 False。

    要检查值是否相等,请使用==,例如assert x == y。 或者,要断言它们不相等,请使用!=,例如assert x != y.

    x = 257
    y = 257
    
    
    >>> id(x)
    4576991320
    
    >>> id(y)
    4542900688
    
    >>> x is y
    False
    
    x = 257
    y = 257 + 0
    
    >>> id(x)
    4576991368
    
    >>> id(y)
    4576991536
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2012-06-26
      • 2016-07-26
      • 2011-03-09
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多