什么时候 `string.swapcase().swapcase()` 不等于 `string`?

When is `string.swapcase().swapcase()` not equal to `string`?

Documentation 对于 str.swapcase() 方法说:

Return a copy of the string with uppercase characters converted to lowercase and vice versa. Note that it is not necessarily true that s.swapcase().swapcase() == s.

我想不出一个例子 s.swapcase().swapcase() != s,谁能想到一个?

一个简单的例子是:

s = "ß"

print(s.swapcase().swapcase())

Ouput:

ss

ß is German lowercase double s (The correct uppercase version would be )。发生这种情况的原因是 Python 不 "know" 或者想为每个 unicode 符号定义大写转换。所以它通过将 s.swapcase() 评估为 "SS" 来采取简单的方法,因此 s.swapcase().swapcase()"ss".

事实上,例子范围很广:它发生在一些希腊符号、德国符号、亚美尼亚符号和其他 specific/special 符号上。

全部获取:

find_dif = lambda s: s.swapcase().swapcase() != s

[chr(s) for s in range(100000) if find_dif(chr(s))]

你得到:

['µ', 'ß', 'İ', 'ı', 'ʼn', 'ſ', 'ǰ', 'ͅ', 'ΐ', 'ΰ', 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϴ', 'ϵ', 'և', 'ᲀ', 'ᲁ', 'ᲂ', 'ᲃ', 'ᲄ', 'ᲅ', 'ᲆ', 'ᲇ', 'ᲈ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẛ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ι', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'Ω', 'K', 'Å', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']

我们来看看:

s1 = 'µ'
s2 = s1.swapcase().swapcase()

s1 == s2

False

s1 = 'ß'
s2 = s1.swapcase().swapcase()

s1 == s2

False

s1 = 'ﬗ'
s2 = s1.swapcase().swapcase()

s1 == s2

False