为什么在python中设置从具有不同字符编码的字符串列表中选择第一个元素?
作者:互联网
为什么在Python中使用set()添加以设置具有不同字符编码(ASCII,Unicode)的第一个元素?
例如
list1, list2 = [u'string' , 'string'], ['string', u'string']
set1, set2 = set(list1), set(list2)
当我打印set1和set2时,它们有不同的输出
print(set1)
(set([u'string'])
print(set2)
(set(['string']))
解决方法:
具有相同ASCII内容的Unicode和常规字符串获得相同的哈希并被视为相等:
>>> hash(u'string')
-9167918882415130555
>>> hash('string')
-9167918882415130555
>>> u'string' == 'string'
True
将两个“相等”对象放入集合中会导致只剩下一个对象.然后它只会按你在字符串中的顺序排列.
在CPython中,第一个对象获胜;在你的样本中,首先把你的字符串放在首位,所以在同一个集合中添加’string’没有效果,而在另一个样本中’string’是第一个,所以添加u’string’没有效果.
这仅适用于str对象,可以解码为ASCII.超出该代码点及以上的任何数据都不再成立;当你尝试测试相等时,你甚至会得到一个特定的警告:
>>> 'stringå' == u'stringå'
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
>>> 'stringå' in set([u'stringå'])
False
>>> set([u'stringå', 'stringå'])
set([u'string\xe5', 'string\xc3\xa5'])
我的终端恰好设置为UTF-8,因此在交互式会话中输入å最终会以UTF-8编码的字节序列C3 A5结束;这不能像ASCII一样解码,因此比较失败,str和unicode版本不再测试为相等并显示为集合中的单独对象. Python解释器从UTF-8自动解码u’string,以形成unicode对象.
标签:python-unicode,python,unicode,set 来源: https://codeday.me/bug/20190824/1708118.html