【问题标题】:Are quoted dictionary keys an absolute must? [closed]引用的字典键是绝对必须的吗? [关闭]
【发布时间】:2015-01-03 15:15:00
【问题描述】:

只是好奇,做了一个有趣的观察,我不用引用它们就可以定义我的字典键。我猜这是Python中的一个漏洞?

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

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

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

【问题讨论】:

  • 你能举例说明你的意思吗?
  • 你指的是dict(key=1){'key':1}吗?
  • 是的,与上面类似,但 {key:1} 除外,其中 key 不是预先存在的变量。 “走开”,因为在 REPL 中这会引发异常。
  • @rpattiso 确实,+1

标签: python dictionary key


【解决方案1】:

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

>>> dct = {'a': 1, 1: 'a'}
>>> dct['a']
1
>>> dct[1]
'a'
>>>

引用一个键仅仅意味着该键是一个字符串,就像上面的'a'一样。


就您的说法而言:

我不用引用它们就可以定义我的键

我假设你的意思是你做了这样的事情:

dct = {key1: 1, key2: 'a'}

上面的代码真的没有什么特别之处。这只是意味着名称key1key2 指的是可散列对象,它们现在成为字典的键。下面是一个例子:

>>> key1 = 'a'
>>> key2 = 1
>>> dct = {key1: 1, key2: 'a'}
>>> dct[key1]
1
>>> dct[key2]
'a'
>>> dct['a']
1
>>> dct[1]
'a'
>>>

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

dct = dict(key1='a', key2=1)

那你应该知道键是还是普通字符串

>>> 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'
>>>

最后,关于您是否应该始终使用字符串键的问题,答案是视情况而定。如果您需要密钥来保存只能表示为字符串的数据(例如人名),请使用字符串。如果您需要键来保存数字数据(例如 id 数字),请使用整数或浮点数或任何合适的。

简单地说,做任何对你的程序最有意义的事情。

【讨论】:

  • 我认为 rpattiso 可能是对的,他可能正在考虑构造函数语法:dict(key1=1, key2='a'),这与{'key1': 1, 'key2': 'a'} 的含义相同。再说一次,也许不是;从这个问题中很难看出......
  • 是的,很抱歉有歧义。主要是{foo:'foo', bar:'bar'}
  • @iCodez 我读了两遍,但确实回答了我的问题!
  • 实际上@iCodez,问题是键不是变量。我现在会更新问题。
  • @aug2uag - 因为名称 foo 未定义而引发异常。你需要在使用它之前定义它,比如foo = 'whatever'.
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多