为什么在Python中具有相同值的变量具有公共ID?

为什么在Python中具有相同值的变量具有公共ID?,python,Python,在Python中: >>> a = "Hello" >>> b = "Hello" >>> id(a) == id(b) True 为什么??这会在引用对象内存位置的复杂程序中产生问题吗?来自 对于不可变类型[如字符串],计算新 值实际上可能返回对具有 类型和值相同。例如,在a=1之后;b=1,a和b可以或 可能不会引用值为1的同一对象,具体取决于 实施 在Python中,通常不“引用内存位置”-字符串是不可变的,因此相等的字符串(相同顺序

在Python中:

>>> a = "Hello"
>>> b = "Hello"
>>> id(a) == id(b)
True
为什么??这会在引用对象内存位置的复杂程序中产生问题吗?

来自

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


在Python中,通常不“引用内存位置”-字符串是不可变的,因此相等的字符串(相同顺序的相同字符)也可能相同(相同的精确对象)这一事实并不重要。当您在生产代码中依赖于
stru a is stru b
时,问题就出现了,您真正的意思是
str\u a==str\u b
,因为虽然相同的字符串必然相等,但不能保证相反。如果您看到字符串插入,您的示例将失败,出现
a=“$foo”
b=“$foo”
,cpython将插入任何由字母、下划线和数字组成的字符串,因此,由于使用了
$
,因此字符串不会被插入,这绝对不是什么值得依赖的东西,除非您执行
a,b=“$foo”,“$foo”
或字符串在函数中,否则不会插入非由数字、字母或下划线组成的字符串。解释器中的a=
“$foo
”和
b=“$foo”
不会返回相同的id。在cpython中,小整数被缓存,因此它们总是具有相同的id。您还需要解决这一问题,这会不会在引用对象内存位置的复杂程序中产生问题