【问题标题】:mutable objects changed in-place means what? [duplicate]可变对象就地改变意味着什么? [复制]
【发布时间】:2015-06-18 15:45:09
【问题描述】:

只有可变对象可以就地改变;如果您更改字符串、元组和其他对象,它们将始终需要创建新对象。 就地在这里是什么意思,为什么元组,字符串在这里是特例

【问题讨论】:

  • 就地是 hic et nunc - 你可以随心所欲地操纵它们。 del your_list[i] 将删除列表中的第 i 个项目,这将对列表对象进行实际更改。但是你不能对字符串做同样的事情。如果您想将 a = "string" 更改为其他内容,则必须创建另一个 b 变量,将受控字符串对象保存在其中。如您所料, a 不变。你可以破坏或分配这个变量保存的内存位置,给 b,比如 a=b。
  • @Martijn:欺骗页面上没有解释“就地”这个短语。
  • @unutbu:这里真的重要吗?问题在于理解这两种对象之间的区别是什么。
  • @Martijn:区别对你来说可能并不重要,因为你知道“就地”和“可变”是什么意思,但对于试图了解这些术语含义的人来说可能不是那么清楚.寻找“就地”定义的人不会在欺骗页面上找到它,因为欺骗页面从未提及该术语。由于术语“就地”和“可变”是不可替代的,我认为直接解决 OP 的问题会很好。
  • @unutbu:我看到最佳答案已经使用了“就地”一词。在我看来,这只是一种表达。当概念已经足够好时,我仍然不确定是否需要在这里解释这个习语。重新评估这篇文章和欺骗,我认为没有必要单独解释,真的。

标签: python


【解决方案1】:

在 Python 中,一个变量持有一个 reference 到一个 object

要“更改”变量,您可以更改引用的对象。或者引用其他对象。

“不可变”对象强制您使用第一个解决方案,因为对象本身无法修改。 “可变”对象让您可以在两个选项之间进行选择。


由于字符串是不可变的,您不能“更改”字符串对象。您所能做的就是创建一个新字符串并更新引用以保存该新创建的字符串:

>>> v1 = v2 = "hello"
>>> v1 += "world"

# v1 and v2 no longer references the same object:
>>> v1 is v2
False

>>> v1
'helloworld'
>>> v2
'hello'

但由于列表是可变的,您可以选择“就地”更改它们:

>>> v1 = v2 = ['h', 'e', 'l', 'l', 'o']
>>> v1 += ['w', 'o', 'r', 'l', 'd']

# v1 and v2 still references the same object:
>>> v1 is v2
True

>>> v1
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
>>> v2
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

或者创建一个新列表并更新参考:

>>> v1 = v2 = ['h', 'e', 'l', 'l', 'o']
>>> v1 = v1 + ['w', 'o', 'r', 'l', 'd']

# v1 and v2 no longer references the same object:
>>> v1 is v2
False

>>> v1
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
>>> v2
['h', 'e', 'l', 'l', 'o']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多