关于python:可变对象就地更改意味着什么?

mutable objects changed in-place means what?

本问题已经有最佳答案,请猛点这里访问。

只有可变对象才能在适当的位置进行更改;如果更改了字符串、元组和其他对象,则必须始终创建新对象。就地是什么意思?为什么元组、字符串在这里是特殊情况?


在python中,变量保存对对象的引用。

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

"不可变"对象强制您使用第一个解决方案,因为不能单独修改对象。"可变"对象提供两个选项之间的选择。

因为字符串是不可变的,所以不能"更改"字符串对象。您所能做的就是创建一个新字符串并更新引用以保存新创建的字符串:

1
2
3
4
5
6
7
8
9
10
11
>>> v1 = v2 ="hello"
>>> v1 +="world"

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

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

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

1
2
3
4
5
6
7
8
9
10
11
>>> 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']

或者创建新列表并更新引用:

1
2
3
4
5
6
7
8
9
10
11
>>> 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']