Python字符串不是不可变的吗?那为什么a + " " + b可以?

137 投票
22 回答
161966 浏览
提问于 2025-04-17 12:07

我之前的理解是,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”这个字符串本身。字符串是不可变的,也就是说它们不能被直接修改,而变量可以指向任何它们想指向的东西。

撰写回答