1

这里发生了什么?:

>>> a, b, c = ("TEST", "test", "TEST".lower())
>>> map(id, [a,b,c])
[140341845003072, 140341845003216, 140341845003264]
>>> map(str, [a,b,c])
['TEST', 'test', 'test']
>>> map(type, [a,b,c])
[<type 'str'>, <type 'str'>, <type 'str'>]

“TEST”和“TEST”.lower() 或“test”和“test”.lower() 不应该共享相同的内存位置吗?

编辑:我知道有一个新副本,但我认为当两个字符串相同时,它们共享相同的内存空间,即:

>>> a = "test" 
>>> b = "test"
>>> map(id, (a,b))
[140341845003216, 140341845003216]
>>> a is b
True

在 Python 2.7.3 上,我得到:

>>> a = "test"
>>> a is a.lower()
False
4

3 回答 3

1

文档很清楚。对于string.lower()

Return a copy of s, but with upper case letters converted to lower case.
于 2013-01-31T00:37:46.480 回答
0

如果您希望相同的字符串是相同的对象,intern它们。

默认情况下None, True, False是这样的;以及源中的常量,包括字符串,甚至跨模块。

于 2013-06-28T12:22:14.810 回答
0

不能保证总是如此(相等的字符串总是相同的对象)。但正如其他人所指出的,它取决于 Python 实现(例如,对于带有 CPython 3.2.3 的 Dietrich,它是同一个对象)。

CPython 2.7 的代码很简单:https ://github.com/albertz/CPython/blob/master/Objects/stringobject.c#L1984

于 2013-10-15T15:48:15.067 回答