如果 Python 中的字符串是不可变的,为什么我可以在函数中更改字符串?

If strings in Python are immutable, why can I change a string in a function?

我是 Python 的新手,我正在编写一个函数来更改字符串中所有字符的大小写。该函数本身称为 swapCases(),我在自己的函数中使用库函数 swapcase()。这是我用来测试我的功能的代码:

print(swapCases("HoLa"))

在第一种情况下,我的函数为:

def swapCases(s):
    for i in range(len(s)):
        s[i] = s[i].swapcase()
    return s

当我 运行 这段代码时,我从编译器收到一条消息: "str object does not support item assignment." 我用谷歌搜索了这条消息,它说 Python 中的字符串是不可变的,因此不能被改变。但是,当我将函数更改为此时:

def swapCases(s):
    s = s.swapcase()
    return s

函数完全符合我的要求,测试打印出 "hOlA." 如果字符串在 Python 中是不可变的,为什么会这样?不可变不意味着我不能改变它们吗?

您的函数没有修改字符串对象。它正在修改分配给它的名称。当你直接赋值时,像这样,

s = "abc"
s[2] = "z"

...你说的是 "change the third character in this particular string object to 'z'." 另一方面,如果你分配两次,像这样,

s = "abc"
s = "abz"

...你说的是 "change the name, s, to refer to a new string object." 无论它是作为局部变量(如上所述)还是作为函数参数创建的,这都适用。

通过将其分配给变量 s,您正在重新分配 s。这摆脱了对旧字符串 "HoLa" 的引用,并将其替换为对从 s.swapcases()

返回的字符串的引用

在您原来的情况下,您正试图按索引修改字符串索引。这样做会改变现有的引用,这是不允许的。这就是不可变的意思。