Python中的字符串是不可变的吗?为何a += 'matata'能改变变量值?
Python字符串不可变?那为什么
a += 'matata'能生效? 嘿,这个问题戳中了很多Python初学者的认知盲区,我来给你掰扯清楚!
首先明确:Python的字符串确实是不可变的
没错,Python里的字符串是不可变类型——意思是,一旦一个字符串对象被创建,它里面的字符就再也不能被直接修改了。比如你试试这段代码:
a = 'hakuna' a[0] = 'H' # 运行会直接报错:TypeError: 'str' object does not support item assignment
这就是字符串不可变的直接体现:你没法直接修改原字符串里的任何一个字符。
那a += ' matata'到底是怎么回事?
你看到的“修改”其实是个假象!a += ' matata'本质上等价于a = a + ' matata',它做了这几件事:
- 找到变量
a当前指向的字符串'hakuna' - 把它和新字符串
' matata'拼接,生成一个全新的字符串对象'hakuna matata' - 把变量
a的指向从原来的'hakuna'切换到这个新的字符串对象上
原来的'hakuna'字符串其实还躺在内存里,只是变量a不再引用它了,之后会被Python的垃圾回收机制悄悄清理掉。
你可以用id()函数验证这一点——id()会返回对象的内存地址:
a = 'hakuna' print(id(a)) # 比如输出:140697645012064 a += ' matata' print(id(a)) # 比如输出:140697645013216
两次输出的地址完全不一样,这就实锤了:前后的a指向的是两个完全不同的字符串对象!
一句话总结
字符串不可变指的是字符串对象本身不能被修改,但变量是可以自由切换指向的——你看到的“修改”,其实是变量换了个新的字符串对象而已~
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

