Python字符串不是不可变的吗?那为什么a + " " + b可以?
我之前的理解是,Python中的字符串是不可变的,也就是说一旦创建就不能改变。
我试了下面这段代码:
a = "Dog"
b = "eats"
c = "treats"
print a, b, c
# Dog eats treats
print a + " " + b + " " + c
# Dog eats treats
print a
# Dog
a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!
那Python为什么没有阻止这个赋值呢?我可能漏掉了什么。
有没有人知道原因?
22 个回答
54
变量a指向了一个叫“狗”的对象。可以把Python中的变量想象成一个标签。你可以把这个标签移动到不同的对象上,这就像你把a = "dog"
改成a = "dog eats treats"
一样。
不过,不可变性是指对象本身,而不是标签。
如果你试着用a[1] = 'z'
把"dog"
改成"dzg"
,你会收到一个错误提示:
TypeError: 'str' object does not support item assignment"
因为字符串不支持单个字符的赋值,所以它们是不可变的。
69
字符串对象本身是不可改变的。
但是,指向这个字符串的变量a
是可以改变的。
想想看:
a = "Foo"
# a now points to "Foo"
b = a
# b points to the same "Foo" that a points to
a = a + a
# a points to the new string "FooFoo", but b still points to the old "Foo"
print a
print b
# Outputs:
# FooFoo
# Foo
# Observe that b hasn't changed, even though a has.
226
最开始,a
指向了字符串“Dog”。然后你把变量a
改成指向一个新的字符串“Dog eats treats”。其实你并没有改变“Dog”这个字符串本身。字符串是不可变的,也就是说它们不能被直接修改,而变量可以指向任何它们想指向的东西。