为啥具有相同值的变量在 Python 中具有公共 ID? [复制]

Posted

技术标签:

【中文标题】为啥具有相同值的变量在 Python 中具有公共 ID? [复制]【英文标题】:Why variables holding same value has the common ID in Python? [duplicate]为什么具有相同值的变量在 Python 中具有公共 ID? [复制] 【发布时间】:2016-01-03 05:42:24 【问题描述】:

在 Python 中:

>>> a = "Hello"
>>> b = "Hello"
>>> id(a) == id(b)
True

为什么?这会在引用对象内存位置的复杂程序中产生问题吗?

【问题讨论】:

在 Python 中,您通常不会“引用内存位置” - 字符串是不可变的,因此 equal 字符串(相同的字符以相同的顺序)也可能是 identical (相同的确切对象)并不重要。当您在生产代码中依赖 str_a is str_b 而您真正的意思是 str_a == str_b 时,问题就来了,因为虽然相同的字符串必然相等,但不能保证相反。 您看到的是字符串实习,***.com/questions/28329498/…,您的示例将因a = "$foo"b = "$foo" 而失败,cpython 将实习任何由任何字母、下划线和数字组成的字符串,所以因为$被使用的字符串不会被迭代,它绝对不是依赖的东西 【参考方案1】:

来自the Python documentation

对于不可变类型[如字符串],计算新的操作 values 实际上可能返回对任何现有对象的引用 相同的类型和值。例如,在 a = 1; b = 1ab 之后可能或 可能不会引用值为 1 的同一对象,具体取决于 实施...

【讨论】:

字符串不是由数字、字母或下划线组成的,除非您执行a, b = "$foo", "$foo" 或字符串在函数中,否则不会被保留。 a = "$foo" 和 b = "$foo" 在解释器中不会返回相同的 id。在 cpython 中,小整数被缓存,因此它们总是具有相同的 id 您还需要解决这是否会在引用对象的内存位置的复杂程序中产生问题

以上是关于为啥具有相同值的变量在 Python 中具有公共 ID? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名

为啥浮点字典键可以覆盖具有相同值的整数键?

为啥在具有相同变量的语句中使用多个等号?

如何声明多个具有相同值的变量

如何保存更新后与以前具有相同值的变量?

同时覆盖具有相同值的变量是不是安全?