引用字典键是否绝对必要?

12

只是好奇,我发现可以在不加引号的情况下定义字典键。这是否意味着Python存在漏洞?

在代码中,以下语句不会引发异常:

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

Python程序员如何处理他们的键?您是否主张使用未引用或引用的键,以及为什么?


你能举个例子说明你的意思吗? - Steven Rumbalski
3
你是在指 dict(key=1){'key':1} 吗? - ryanpattison
是的,与上面类似,只不过{key:1}中的key不是一个预先存在的变量。在REPL中会抛出异常,因此需要注意。 - aug2uag
1个回答

19

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

>>> 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'}意思相同。但也有可能不是这样,从问题中很难判断... - abarnert
是的,抱歉有些含糊。大致上是像 {foo:'foo', bar:'bar'} 这样的东西。 - aug2uag
@iCodez 我不得不读两遍,但是没错,它回答了我的问题! - aug2uag
实际上,@iCodez,问题是键不是变量。我现在会更新问题。 - aug2uag
@aug2uag - 抛出异常是因为名称“foo”未定义。在使用它之前,您需要定义它,例如foo ='whatever' - user2555451
@iCodez 我明白了,但是“信不信由你”,在REPL之外(使用2.7)并没有抛出异常。然而,从讨论中我可以得出结论,对于Python程序员来说,不引用键名的概念绝对是荒谬的,这正是我想要的答案。感谢您的帮助! - aug2uag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接