好吧,修改一个字符串不会修改第二个字符串是有原因的。
python 中的字符串是不可变的。
字符串并不完全缓存在 python 中,但事实是您无法更改它们。 python 解释器能够进行一定程度的优化,并将两个名称引用到同一个 id。
在 python 中,您实际上永远不会直接编辑字符串。看这个:
a = "fun"
a.capitalize()
print a
>> fun
Capitalize 函数将创建大写版本a
但不会改变a
。一个例子是str.replace
。您可能已经注意到,要使用替换来更改字符串,您必须执行以下操作:
a = "fun"
a = a.replace("u", "a")
print a
>> fan
你在这里看到的是这个名字a
正在受到指向“乐趣”的指针的影响。在第二行,我们正在影响一个新的 ida
和旧的a
如果没有类似的字符串,可能会被 gc 删除。
你必须明白的是,由于字符串是不可变的,Python 可以安全地让字符串指向相同的 id。因为字符串永远不会被修改。您不能拥有隐式修改的字符串。
此外,您还会看到一些其他类型(例如数字)也是不可变的,并且与 id 具有相同的行为。但不要被 ids 愚弄,因为出于某种我无法解释的原因。
任何大于 256 的数字都会收到不同的 id,即使它们指向相同的值。如果我没记错的话,字符串越大,ID 也会不同。
Note:
当在 repl 或程序本身内评估代码时, id 也可能具有不同的值。我记得有一种情况是用代码块来优化代码。这意味着在不同的行上执行代码可能足以阻止优化。
这是 REPL 中的一个示例:
>>> a = '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'; b = '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> id(a), id(b)
(4561897488, 4561897488)
>>> a = '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> b = '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> id(a), id(b)
(4561897416, 4561897632)
带数字:
>>> a = 100000
>>> b = 100000
>>> id(a), id(b)
(140533800516256, 140533800516304)
>>> a = 100000; b = 100000
>>> id(a), id(b)
(140533800516232, 140533800516232)
但是作为 python 脚本执行文件将会打印,因为它执行同一代码块中的行(据我所知)
4406456232 4406456232
4406456232 4406456232
140219722644160 140219722644160