被引用的字典键绝对必须吗?

aug*_*uag 2 python dictionary key

只是好奇,做了一个有趣的观察,我得到了定义我的字典键而不必引用它们.我猜这是Python中的一个漏洞?

在示例中,而不是在REPL中,以下内容不会引发异常:

>>> {foo:'foo', bar:'bar'}
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 NameError: name 'foo' is not defined
Run Code Online (Sandbox Code Playgroud)

Pythonistas如何处理他们的密钥?你提倡不带引号或引用的密钥,为什么?

iCo*_*dez 8

字典的键可以是任何可哈希的对象(字符串,整数,元组等):

>>> dct = {'a': 1, 1: 'a'}
>>> dct['a']
1
>>> dct[1]
'a'
>>>
Run Code Online (Sandbox Code Playgroud)

引用密钥只是意味着密钥是一个字符串,'a'如上所述.


至于你的主张:

我没有引用它们就定义了我的密钥

我认为你的意思是你做了这样的事情:

dct = {key1: 1, key2: 'a'}
Run Code Online (Sandbox Code Playgroud)

上面的代码确实没有什么特别之处.它只是意味着名称key1key2引用可编辑对象,现在它们成为字典的键.一个例子如下:

>>> key1 = 'a'
>>> key2 = 1
>>> dct = {key1: 1, key2: 'a'}
>>> dct[key1]
1
>>> dct[key2]
'a'
>>> dct['a']
1
>>> dct[1]
'a'
>>>
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您的意思是您使用dict内置函数来制作字典:

dct = dict(key1='a', key2=1)
Run Code Online (Sandbox Code Playgroud)

那么你应该知道键仍然是正常的字符串:

>>> dct = dict(key1='a', key2=1)
>>> dct
{'key2': 1, 'key1': 'a'}
>>> dct[key1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'key1' is not defined
>>> dct['key1']
'a'
>>>
Run Code Online (Sandbox Code Playgroud)

最后,关于你是否应该总是使用字符串键的问题,答案取决于它.如果您需要密钥来保存只能表示为字符串的数据(例如人名),请使用字符串.如果需要键来保存数字数据(例如id号),请使用整数或浮点数或任何合适的数据.

简单地说,做一些对你的程序最有意义的事情.