【问题标题】:Why does a string need an assignment operator to change it, but a list doesn't? [duplicate]为什么字符串需要赋值运算符来更改它,而列表不需要? [复制]
【发布时间】:2015-04-30 14:10:05
【问题描述】:

我不明白为什么在这个例子中,使用 .lower() 方法不会在没有赋值的情况下更改字符串,但是 .reverse() 方法会在没有赋值的情况下更改列表。某些数据类型是否需要分配才能更改,而其他数据类型不需要?为什么?谢谢。

a = "ABC"
a.lower()

b = [1, 2, 3]
b.reverse()

print(a)
print(b)

【问题讨论】:

  • 因为字符串是不可变的,而列表是可变的
  • 你不能改变一个字符串对象,句号。您总是必须替换绑定的名称以指向一个新的字符串对象。
  • 另外,有些方法不会改变它们的对象,即使这些对象是可变的。
  • 这应该被否决。如果有人问OP做了什么,就不可能找到“原始”问题。如果有人这样做,那是因为他已经知道答案了。重定向到那个很好,但是这个问题应该被推广已经完成了。

标签: python


【解决方案1】:

某些数据类型是否需要赋值才能更改,而其他数据类型不需要?

是的。

为什么?

因为这是每种类型提供的 API 的一部分。

某些类型的对象(如列表)提供了改变其数据的方法(如list.reverse)。其他人没有。为了有效地使用它,这只是您需要了解的类型的一部分。在 Python 用语中,允许这种突变的类型称为“可变”,而不允许这种突变的类型称为“不可变”。

(从技术上讲,在上面的示例中,您永远不会“更改”字符串。相反,您创建一个新字符串并将其分配给用于指向旧字符串的变量。这与列表中的重要方法不同例如,实际列表对象已更改。您可以通过搜索可变对象与不可变对象的讨论来找到有关差异的大量信息。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2014-05-29
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多