【问题标题】:Boolean as key in dictionary is causing weird problems?布尔值作为字典中的键会导致奇怪的问题吗?
【发布时间】:2018-01-21 07:41:44
【问题描述】:

我是 Python 新手,目前正在学习字典。我将随机值和类型放入字典中。这让我感到困惑:

stuff = {True: 1234, 1: 2}
print(stuff[True])
print(len(stuff))

当你运行这段代码时,输​​出是:

2
1

这是怎么输出的? print(stuff[True])不应该输出1234print(len(stuff))输出2吗?我可能遗漏了一些非常明显的东西,但是有人可以解释发生了什么吗?

【问题讨论】:

  • True == 1; boolint 的子类型。
  • @Ryan 所以Python实际上将{True: 1234, 1: 2}解释为{1: 1234, 1: 2}?我想这解释了len 问题。但是,为什么它选择2而不是1234,尤其是1234是第一位的?
  • 如果你有多个相等的键,最后一个是使用其值的那个。你可以把它想象成{1: 1234, 1: 2},但它不是真的True1 是不同的,但与 == 比较是相等的,并且字典键会根据该相等性进行比较。*
  • @Ryan ohhh 好的,我现在明白了,我刚刚调试了我的程序。你是对的,1: 2 覆盖了1: 1234,所以当解释器读完字典时,它已经把它读成了stuff = {1: 2}。这解释了这两个问题。感谢您的宝贵时间。
  • @parrot15,您收到想要的答案了吗?

标签: python dictionary


【解决方案1】:

尽管 python 是动态类型的,但在字典中使用异构键类型被认为是一种不好的做法。

运行 {True: 'a', 1: 'b', 1.0: 'c'} 实际上会映射到 {True: 'c'}

这是因为1==1.01==True,因此它们具有相同的hash

最终结果是使用第一个键,并更新最后一个值。

如果您出于某种原因想要将True1 分开,也可以使用它们的类型作为键(例如(x, type(x))

{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'}

【讨论】:

  • 我建议(x, type(x))repr(x) 更有效但成本更低
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
相关资源
最近更新 更多