之前写过一篇关于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’跟单个数字一样,产生了一个新的对象。
所以会出现这样的结果啦。