Python 中的对象驻留无法正常工作

问题描述 投票:0回答:1

我是一名Python程序员,我对Python中的对象实习有一些疑问:

a=  10
b= 10
print(a is b)  #evaluates to true

但是,

a= '123098'
b= '123098'
print(a is b) #should print False

在我的机器中...我已经安装了python 3.12,问题是我了解到python确实从-5到256进行对象实习...就像我将257分配给它们的内存地址不应该相同但我的解释器打印是否正确....有任何信息吗?谢谢!

python optimization integer long-integer string-interning
1个回答
0
投票

以下是 Python 中对象驻留的细分以及它如何应用于您的观察:

整数实习:

  • Python 实习生(重用)特定范围内的整数,通常为 -5 到 256,以优化性能。
  • 在Python 3.8及更高版本中,整数驻留通常限制在这个范围内。
  • 但是,Python 仍可能会保留超出此范围的某些整数,具体取决于实现和使用模式。

字符串实习:

  • Python也会在某些条件下实习字符串,但规则更复杂:
    • 驻留通常发生在仅由 ASCII 字母、数字和下划线组成的短字符串(CPython 3.7 及更高版本中最多 4096 个字符)。
    • 但是,字符串驻留行为可能因 Python 版本和实现而异。

您的观察:

  1. a = 10; b = 10; print(a is b)
    计算结果为 True:

    • 这是预期的,因为 10 在典型的实习范围内,因此
      a
      b
      都指同一个实习对象。
  2. a = '123098'; b = '123098'; print(a is b)
    计算结果为 False:

    • 这也是预期的,因为对于较长的字符串或具有非 ASCII 字符的字符串,不能保证字符串驻留。
  3. a = 257; b = 257; print(a is b)
    计算结果为 True:

    • 这表明您的 Python 实现要么是驻留超出 -5 到 256 典型范围的整数,要么执行一些其他优化,从而为
      a
      b
      提供相同的内存地址。

要点:

  • 依赖对象驻留进行比较可能不可靠,尤其是对于典型驻留范围之外的值。
  • 为了进行可靠的比较,请使用
    ==
    检查值是否相等,而不是使用
    is
    检查对象身份。
  • 如果您特别需要确保对象身份,请考虑使用
    sys.intern()
    函数手动驻留字符串。
© www.soinside.com 2019 - 2024. All rights reserved.