Python 是否以写入时复制的方式操作字符串对象

roa*_*oul 6 python unix string types copy-on-write

我注意到在Python中,字符串对象只保留一份副本。就像下面的代码:

>>> s1='abcde'
>>> s2='abcde'
>>> s1 is s2
True
Run Code Online (Sandbox Code Playgroud)

s1和s2指向同一个对象。

当我编辑 s1 时,s2 仍然保留对象('abcde'),但 s1 指向一个新副本。这种行为就像写时复制。

>>> s1=s1+'f'
>>> s1 is s2
False
>>> s1
'abcdef'
>>> s2
'abcde'
Run Code Online (Sandbox Code Playgroud)

那么Python真的在字符串对象上使用写时复制机制吗?

Bre*_*arn 3

没有任何相关意义上的复制发生。您的新字符串是一个全新的字符串对象。这与你所做的没有什么不同s1 = 'abcdef'。Python 中的某些类型的对象允许您“就地”修改它们,但不能修改字符串。(用 Python 的话说,字符串是不可变的。)

请注意,两个原始字符串是同一对象的事实是由于特定于实现的优化而导致的,并且并不总是如此:

>>> s1 = 'this is a longer string than yours'
>>> s2 = 'this is a longer string than yours'
>>> s1 is s2
False
Run Code Online (Sandbox Code Playgroud)