1

Python 字符串应该像整数一样是不可变的。考虑一下:

>>> num1 = 34
>>> num2 = 36
>>> id(num1)
505894832
>>> num4 = 34
>>> id(num4)
505894832

num4具有与 num1 完全相同的 ID,这意味着它们指向同一事物。字符串不应该发生同样的事情吗?我很困惑:

>>> name = "Sumeet"
>>> id(name)
35692000
>>> name = "Ali"
>>> id(name)
35926912
>>> naam = "Sumeet"
>>> id(naam)
35926848

最后的输出不应该是: 35692000

4

3 回答 3

5

多个变量具有相同 id 的事实与实际对象是不可变的没有太大关系。

事实上,由于它们的不变性,这可以安全地发生(节省内存)。

假设 python 中的字符串不是不可变的,您声明:

a = 'abc'

b = 'abc'

如果你改变了a,这意味着b要么引用一个完全不同的对象(复制表示相同文字字符串所需的内存),或者当a改变时,必须复制整个对象才能进行更改(这样 b 就不会受到影响)。

由于字符串是不可变的,因此两个变量可以安全地指向同一个对象。对不可变数据结构的任何更改都会创建一个新结构,并且指向它的引用将更改为新结构,而对“旧”结构的所有其他引用保持不变。不可变数据结构中没有副作用极大地降低了由于共享结构/对象在代码中的其他位置被更改而发生错误的可能性。

于 2012-12-18T12:03:22.717 回答
3

CPython 实习了一些非常小的整数和非常小的字符串,但你不能依赖它,因为它依赖于实现。

因此,这里有一些针对您的发现的反例:

>>> a = 123456
>>> b = 123456
>>> id(a)
30497296
>>> id(b)
30496144
>>> a = "hey"
>>> b = "hey"
>>> id(a)
44067112
>>> id(b)
44067112
于 2012-12-18T12:01:44.137 回答
2

不,它并不指向同一件事,原因很简单。

当你这样做时:

name = 'Sumeet'

您实际上创建了一个新string对象并将其绑定到name引用。当你这样做时:

naam = 'Sumeet'

您将再次创建一个NEW string对象并将其绑定到naam引用。为了让它们指向同一个对象,您应该这样做:

naam = name

这使得naam引用同一个对象name


关于整数,CPythonPython 的实现有一个缓存小整数的特性。例如,根据这个源python 3.2 缓存整数对象从-5to 256

于 2012-12-18T12:13:59.523 回答