11

在 Python 中是否可以使用 Unicode 字符作为字典的键?我有用作键的 Unicode 西里尔字母。尝试通过键获取值时,我得到以下回溯:

 Traceback (most recent call last):
 File "baseCreator.py", line 66, in <module>
    createStoresTable()
 File "baseCreator.py", line 54, in createStoresTable
    region_id = regions[region]
 KeyError: u'\u041c\u0438\u043d\u0441\u043a/\u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0439\xa0'
4

2 回答 2

8

是的,这是可能的。您收到的错误意味着您使用的密钥在您的字典中不存在。

要调试,请尝试print使用您的字典;你会看到每个键的 repr 应该显示实际键的样子。

于 2012-07-27T19:56:18.217 回答
3

Python 2.x 在比较两个键以测试一个键是否已经存在、访问一个值或覆盖一个值时,会将两个键都转换为字节串。一个键可以存储为 Unicode,但如果两个不同的 Unicode 字符串简化为相同的字节串,则它们不能同时用作键。

In []: d = {'a': 1, u'a': 2}
In []: d
Out[]: {'a': 2}

在某种意义上,您可以使用 Unicode 键。

Unicode 键保留在 Unicode 中:

In []: d2 = {u'a': 1}
In []: d2
Out[]: {u'a': 1}

您可以使用任何“等于”现有键的Unicode 字符串或字节字符串访问该值:

In []: d2[u'a']
Out[]: 1

In []: d2['a']
Out[]: 1

使用密钥或“等于”密钥的任何内容写入新值将成功并保留现有密钥:

In []: d2['a'] = 5
In []: d2
Out[]: {u'a': 5}

因为与'a'现有键相比True,与现有 Unicode 键对应的值被替换为5。在我给出的第一个示例u'a'中,文本中提供的第二个键 ford与之前分配的键进行了真实比较,因此字节串'a'被保留为键,但值被2.

于 2015-12-30T11:04:02.057 回答