是的!针对您的具体问题
我是否总会得到与Linux sort和LC_ALL=C
相同的结果?
是的!Python默认使用C
语言环境,因此您可以期望与Linux LC_ALL=C sort
相同的行为。
您可以通过自己设置并使用strxfrm进行排序来更明确地说明这种行为:
locale.setlocale(locale.LC_ALL, 'C')
locale.setlocale(locale.LC_COLLATE, 'C')
mylist.sort(key=locale.strxfrm)
mylist.sort(key=lambda i: locale.strxfrm( mysortfunc(i) ))
文档
来自https://docs.python.org/3/library/locale.html:
初始情况下,当程序启动时,区域设置是“C”区域设置,无论用户的首选区域设置是什么。... 程序必须明确表示它希望使用用户首选的其他类别的区域设置,通过调用setlocale(LC_ALL, '')
。
根据POSIX标准,如果一个程序没有调用setlocale(LC_ALL, '')
,则使用可移植的“C”区域设置。调用setlocale(LC_ALL, '')
可以让程序使用由LANG
变量定义的默认区域设置。由于我们不想干扰当前的区域设置,因此我们以上述方式模拟了这种行为。
示例
>>> import locale
>>> locale.setlocale(locale.LC_ALL, None)
'LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C'
>>> locale.getlocale(locale.LC_COLLATE)
(None, None)
>>> locale.setlocale(locale.LC_COLLATE, '')
'en_US.UTF-8'
>>> locale.setlocale(locale.LC_ALL, None)
'LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=en_US.UTF-8;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C'
>>> mylist.sort(key=locale.strxfrm)
>>> mylist.sort(key=lambda i: locale.strxfrm( mysortfunc(i) ))
>>> locale.setlocale(locale.LC_ALL, '')
'en_US.UTF-8'
>>> locale.setlocale(locale.LC_ALL, None)
'en_US.UTF-8'
>>> locale.getlocale(locale.LC_COLLATE)
('en_US', 'UTF-8')
>>> locale.setlocale(locale.LC_ALL, 'C')
'C'
>>> locale.setlocale(locale.LC_ALL, None)
'C'
>>> locale.setlocale(locale.LC_COLLATE, None)
'C'
>>> locale.getlocale(locale.LC_COLLATE)
(None, None)
非常感谢
Frédéric Hamidi的回答,它让我朝着正确的方向理解了这个问题。