编程语言
首页 > 编程语言> > 为什么在python中设置从具有不同字符编码的字符串列表中选择第一个元素?

为什么在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