我说:
import collections, random
d = collections.defaultdict(list)
d['foo'].append('bar')
然后我选择一个随机元素:
random.choice(d)
现在让我们打印d
:
defaultdict(list, {0: [], 'foo': ['bar']})
为什么random.choice
添加0
作为密钥?
答案 0 :(得分:6)
在内部,这是random.choice
的作用:
def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
return seq[int(self.random() * len(seq))]
在你的情况下,长度为1,在乘法后,它会产生范围[0.0, 1.0)
中的数字,并且在应用int()
后,你将得到0。
请注意defaultdict
会在其上访问的dict中添加任意键:
>>> d = collections.defaultdict(list)
>>> d['i dont exist']
[]
>>> d
defaultdict(<type 'list'>, {'i dont exist': []})
因此,你的词典以0
结束。
答案 1 :(得分:1)
我认为行为实际上是 undefined ,因为根据文件(强调我的):
random.choice(seq)
从非空中返回一个随机元素 序列 seq。如果seq为空,则引发IndexError。
seq
需要是序列类型,例如list
,tuple
和range
。但是,defaultdict
是内置dict
类的子类,因此它是映射类型。
由于序列类型只能将整数作为“键”,因此random.choice
查找d[x]
为什么x
是range(0, len(d))
中的整数并不奇怪。