python单变量赋值,字符串赋值的变与不变

时间:2022-10-28 20:31:30

之前写过一篇关于python里列表对象的’=’的一个陷阱
今天一个初学python的同学跟我讨论问题的时候,我们把这个问题扩展了一下。

我们知道,对于列表变量来说,赋值等于地址的传递,那么在原先的变量上做修改,同样会反应到被赋值的新变量上来,具体如下:

>>> a=[2]
>>> b=a
>>> a.append(3)
>>> b
[2, 3]

那么,对于单个变量来说,还是这样吗?事实上不是了,如下:

>>> a=2
>>> b=a
>>> a=3
>>> b
2

为什么会不一样呢?不是python里的赋值就是内存里一个对象的地址的传递吗。
事实上,在上面第三部的时候,
a=3 已经产生了一个新的对象,即3被分配给了一个新的地址,这个地址又被传递给了a变量,而之前的地址保存的2还存留在b的变量下面,所以b并没有改变。

同样的,对于字符串呢?我想到,字符串事实上不就是列表吗,所以应该也是跟列表一样的情况,实验结果又打脸了:

b='dddd'
>>> a=b
>>> b=b+'111'
>>> b
'dddd111'
>>> a
'dddd'

没变啊!这又是为什么。

想了一下想起这句话,python里的字符串是不可变的。

这意味着 ‘dddddd’+’111’跟单个数字一样,产生了一个新的对象。
所以会出现这样的结果啦。