Python字符串不可变?

Python字符串不可变?,python,string,python-3.x,immutability,Python,String,Python 3.x,Immutability,Python字符串应该是不可变的,就像整数一样。考虑这一点: >>> num1 = 34 >>> num2 = 36 >>> id(num1) 505894832 >>> num4 = 34 >>> id(num4) 505894832 num4与num1具有完全相同的ID,这意味着它们指向相同的对象。字符串不应该发生同样的事情吗?我感到困惑的是: >>> name = "Sumeet"

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

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

下面是一些与你的发现相反的例子:

>>> a = 123456
>>> b = 123456
>>> id(a)
30497296
>>> id(b)
30496144
>>> a = "hey"
>>> b = "hey"
>>> id(a)
44067112
>>> id(b)
44067112

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

下面是一些与你的发现相反的例子:

>>> a = 123456
>>> b = 123456
>>> id(a)
30497296
>>> id(b)
30496144
>>> a = "hey"
>>> b = "hey"
>>> id(a)
44067112
>>> id(b)
44067112

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

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

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

a='abc'

b='abc'

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


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

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

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

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

a='abc'

b='abc'

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


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

不,出于一个明确而简洁的原因,它没有指向相同的事情

执行此操作时:

name = 'Sumeet'
naam = 'Sumeet'
实际上,您创建了一个新的
字符串
对象,并将其绑定到
名称
引用。执行此操作时:

name = 'Sumeet'
naam = 'Sumeet'
再次创建一个新的
字符串
对象,并将其绑定到
naam
引用。为了使它们指向同一对象,您应该执行以下操作:

naam=name

这使得
naam
引用的对象与
name
引用的对象相同



关于整数,Python的
CPython
实现具有缓存小整数的特性。例如,根据python 3.2,将整数对象从
-5
缓存到
256
不,出于一个清晰简洁的原因,它并不指向相同的东西

执行此操作时:

name = 'Sumeet'
naam = 'Sumeet'
实际上,您创建了一个新的
字符串
对象,并将其绑定到
名称
引用。执行此操作时:

name = 'Sumeet'
naam = 'Sumeet'
再次创建一个新的
字符串
对象,并将其绑定到
naam
引用。为了使它们指向同一对象,您应该执行以下操作:

naam=name

这使得
naam
引用的对象与
name
引用的对象相同



关于整数,Python的
CPython
实现具有缓存小整数的特性。例如,根据python 3.2,将整数对象从
-5
缓存到
256

,不可变只是意味着它们不能被修改。它与同一个字符串是否有多个副本无关。此外,python实习低整数并重用它们。它们毕竟是不变的。实际上,您只需要1份数字的副本
1
。因此,对于字符串,我们是否需要多份相同的“Hello”。。。它们也是不可变的?另外:Python可以重用内存地址
id()
不能保证是唯一的。这与您有什么关系?不可变只是意味着它们不能被修改。它与同一个字符串是否有多个副本无关。此外,python实习低整数并重用它们。它们毕竟是不变的。实际上,您只需要1份数字的副本
1
。因此,对于字符串,我们是否需要多份相同的“Hello”。。。它们也是不可变的?另外:Python可以重用内存地址
id()
不保证是唯一的。这与您有什么关系?这是否意味着“该值可能在该地址保持安全,也可能不在该地址保持安全”。@NikhilKhullar:从Python的角度来看,这个问题没有真正的意义。该语言不公开“地址”或“指针”以确保安全。您只需要知道字符串、元组和整数是不可变的,而列表/字典/集合则不是。既然不能对字符串进行变异,请绑定