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() は同じメモリ位置を共有すべきではありませんか?

編集:新しいコピーがあることはわかりましたが、2つの文字列が同じ場合、同じメモリ空間を共有すると思いました。つまり:

>>> 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 を使用するディートリッヒの場合、それは同じオブジェクトです)。

CPython 2.7 のコードは非常に単純です: https://github.com/albertz/CPython/blob/master/Objects/stringobject.c#L1984

于 2013-10-15T15:48:15.067 に答える