【问题标题】:Mutable and Immutable Strings in pythonpython中的可变和不可变字符串
【发布时间】:2017-11-14 14:00:50
【问题描述】:

我只是在 python 中浏览可变和不可变结构。 在 Python 中写到“字符串是不可变的”,即我们无法更改它们 考虑代码:

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

这给出了输出:

'Mohit'

现在,有人说是变量 str1 指向字符串“Rohit”,在 str1.replace() 之后它指向“Mohit” 考虑这段代码:

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

这也给了我输出:

'Mohit'

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

【问题讨论】:

  • "有人说是变量 str1 指向字符串 'Rohit' 而在 str1.replace() 之后它指向 'Mohit'" 你可以告诉那个人他错了。 str1 不会更改,除非您执行 str1 = str1.replace(...),在这种情况下,它会被分配一个新字符串,旧的字符串会被丢弃,但不会更改。
  • 如果你想做 str[0]="M" 你就做不到。

标签: python string replace immutability mutability


【解决方案1】:

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

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

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

如您所见,s1 仍然具有其原始值。

【讨论】:

  • >>>a='Rohit' >>> id(a) 52641584L >>> a=a.replace('R','M') >>> 一个'Mohit' >> > id(a) 38710648L 这消除了混乱
【解决方案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

【讨论】:

  • 这并没有真正检查s1指向的字符串是否被改变,它只是检查它是否仍然指向同一个实例。
【解决方案3】:

字符串在 Python(和其他语言)中被称为不可变字符串,因为一旦创建了初始字符串,对其起作用的函数/方法都不会直接更改它,它们只是返回新字符串。

所以,在你的例子中

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

在调用.replace 之后,您应该尝试在您的REPL 中评估str1。看到str1 仍然保持值“Rohit”,您可能会感到惊讶。 .replace 返回一个 new 字符串,其中给定字符的所有实例都替换为指定字符。您的 REPL 将打印返回的字符串,但之后它会丢失,因为您没有将它分配给任何东西。

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

【讨论】:

    【解决方案4】:

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

    s = "Rohit"
    

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        python 中的不可变字符串

        str1 = "Rohit" str1.replace("R", "M") print(str1)

        输出

        Rohit

        print(str1 + "hello")

        Rohit hello

        str2 = str1.replace("R","M")

        print(str2)

        输出

        Mohit

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-28
          • 2015-04-15
          • 2020-06-26
          • 1970-01-01
          • 2016-07-04
          • 2016-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多