由replace()返回的字符串和相同的字符串在Python中具有不同的id?

时间:2017-06-22 05:11:44

标签: python

我开始知道python中的任何对象都具有相同的id,无论它使用的位置如何。

a=5
print id(5)==id(a)

此语句打印为True。

a='hillo'
b='hello'
c=b.replace('e','i') #this gives c='hillo'
print id(a)==id(c)

此语句打印False。但为什么呢?

2 个答案:

答案 0 :(得分:1)

  

我开始知道python中的任何对象都具有相同的id,无论其使用的位置如何。

该陈述完全错误。

小整数的ID基于它们的不可变值并且在程序中首次出现,因为它们的值很小而Python会对它们进行缓存。这就是为什么您的第一个示例返回True

但是,在第二个示例中,您要比较两个不同(不可变)字符串的ID,这就是它返回False的原因。通常,新的String(literal)实例每次都会创建一个新的String对象,因此会创建一个不同的ID。

答案 1 :(得分:0)

由于String在python中,方法replace()将字符串的副本返回到另一个地址,其中old的出现已被new替换。这就是为什么有两个不同的身份。另一个类似的案例:

>>> p = "ooo"
>>> q = "ooovooo"
>>> r = p + "vooo"
>>> r
'ooovooo'
>>> q
'ooovooo'
>>> id(q) == id(r)
False

Python将新地址分配给r,其中p和“vooo”的连接。这就是为什么两者都不同的字符串。