Python中的可变和不可变字符串

8

我正在学习Python中的可变和不可变结构。

在文档中写道,"字符串是不可变的",也就是说我们无法改变它们。

考虑以下代码:

str1='Rohit'
str1.replace('R','M')

这将产生以下输出:
'Mohit'

现在,有人说变量str1指向字符串'Rohit',在执行str1.replace()后,它指向了'Mohit'。

考虑以下代码:

'Rohit'.replace('R','M')

这还给了我输出:
'Mohit'

那么,“字符串是不可变的”是什么意思?

2
有人说变量str1指向字符串'Rohit',并且在执行str1.replace()后,它指向了'Mohit'。但实际上,除非你使用str1 = str1.replace(...),否则str1不会改变。如果使用该语句,则将分配一个新字符串,并且旧字符串将被丢弃,但不会被更改。 - tobias_k
https://dev59.com/kmox5IYBdhLWcg3wmFaV - Argus Malware
如果你想做 str[0]="M",你将无法实现。 - Katia Punter
关于“不可变性”,更令人困惑的是+=(即追加)的工作原理。 - CodeClown42
6个回答

18

字符串本身没有任何方法可以改变其值。换句话说: 字符串是不可变的。

当您调用 str.replace 方法时,会构建并返回一个新的字符串。

>>> s1 = 'Rohit'
>>> s2 = s1.replace('R', 'M')
>>> 
>>> s1
'Rohit'
>>> s2
'Mohit'

正如您所看到的,s1 仍保持其原始值。


3
a='Rohit'
id(a) 52641584L a=a.replace('R','M') a 'Mohit' id(a) 38710648L 这消除了困惑
- user8914517

6

在Python和其他编程语言中,字符串被称为不可变的,因为一旦创建了初始字符串,对其进行操作的函数/方法不会直接改变它,而是返回新的字符串。

因此,在您的示例中

str1='Rohit'
str1.replace('R','M')

在调用.replace方法后,您应该在REPL中尝试评估str1。您可能会感到惊讶,因为str1仍然保持值“Rohit”。.replace返回一个字符串,在其中给定字符的所有实例都被替换为指定字符。您的REPL将打印该返回的字符串,但之后它就消失了,因为您没有将其分配给任何内容。
您的第二个示例与str1变量类似,但使用了一个字符串常量。

3

您可以通过在更改前后检查变量的id来检查可变性

In [3]: s1 = 'Rohit'

In [4]: id(s1)
Out[4]: 140510191375440

In [5]: s1.replace('R', 'M')
Out[5]: 'Mohit'

In [6]: id(s1)
Out[6]: 140510191375440

3
这并没有真正检查字符串s1指向的实例是否被更改,它只是检查它是否仍然指向同一个实例。 - tobias_k
这是错误的。简单的反例是:字典是可变的,但是即使在改变后,其id仍然保持不变。 - undefined

2

是的,Python字符串确实是不可变的。 假设您有以下字符串:

s = "Rohit"

现在,s 正确指向字符串对象 "Rohit"。 当你执行类似于

s.replace("R", "M")

这不会直接改变s的值。.replace方法会将“R”替换为“M”,然后返回新创建的对象。在您的情况下,它将是Mohit。这就是您能够看到“Mohit”作为返回值的原因,但它并没有改变s。它是创建一个新的字符串并返回。


1
您之所以得到这样的输出,是因为该代码行对字符串没有任何影响,而是创建了一个新字符串,其中R被替换为M(您可以将其视为返回变量),在Python中,当您仅输入变量名称时,它会被打印在控制台上。我认为这就是造成困惑的原因。


0

你可以将字符串传递给返回新字符串的函数(如replace)。

字符串本身没有操作方法;不过我们可以尝试这样做:

>>> s1 = "abcd"
>>> s1[1:3]
'bc'
>>> s1[2]
'c'
>>> s1[2] = 'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

我们可以像列表一样在字符串上使用下标,但它们是不可写的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接