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

时间:2017-11-14 14:00:51

标签: python string replace immutability mutability

我只是在python中经历可变和不可变的结构。 有人写道"字符串是不变的"在Python中,即我们无法改变它们 考虑一下代码:

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

这给出了输出:

'Mohit'

现在,有人说是变量str1指向字符串' Rohit'并且在str1.replace()之后,它指向' Mohit' 请考虑以下代码:

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

这也给了我输出:

'Mohit'

然后'字符串的意思是不可变的'?

5 个答案:

答案 0 :(得分:10)

字符串上没有任何方法,允许更改字符串的值。换句话说:字符串是不可变的。

当您致电str.replace时,会构建并返回字符串。

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

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

答案 1 :(得分:2)

字符串在Python(和其他语言)中称为Immutable,因为一旦创建了初始字符串,没有任何函数/方法直接更改它,它们只返回新的字符串。

所以,在你的例子中

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

.replace来电之后,您应该尝试在REPL中评估str1。您可能会惊讶地发现str1仍然保留了价值' Rohit'。 .replace返回 new 字符串,其中给定字符的所有实例都替换为指定字符。您的REPL将打印返回的字符串,但之后它会丢失,因为您没有将其分配给任何内容。

你的第二个例子大致相同,但是使用字符串常量而不是像str1这样的变量。

答案 2 :(得分:2)

您可以通过在更改之前和之后检查变量的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 :(得分:0)

你得到这样的输出是因为那行代码对字符串没有任何作用,但是创建了一个新的字符串,其中R替换为M(你可以认为它返回了一个变量),而在python中只需输入一个变量的名称它打印在控制台上。我认为这就是造成混乱的原因。

答案 4 :(得分:0)

是的,Python字符串肯定是不可变的。 假设您有

s = "Rohit"

现在 s 正确指向字符串对象“ Rohit”。 当你做类似的事情

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

这不会改变 s 的位置。 .replace方法会将“ R”替换为“ M”,然后返回新创建的对象。在您的情况下,它将是Mohit。因此,您可以将“ Mohit”视为返回值,但它不会改变 s 。它创建一个新字符串并返回它。