尝试 - 除了Python中的KeyError块

时间:2014-10-06 00:30:40

标签: python keyerror

x是一个元组:(x1,x2)

try:
    clusters[bestmukey].append(x)  # statment 1
except KeyError:
    clusters[bestmukey] = [x]      # statement 2

(1)陈述1和陈述2如何做不同的事情?

(2)为什么需要分开的陈述?

3 个答案:

答案 0 :(得分:3)

clusters[bestmukey].append(x)要求clusters[bestmukey]已存在,并且是可附加到的列表。如果clusters没有正确的密钥,则会引发KeyError。

clusters[bestmukey] = [x]将始终有效(只要clusters是字典,这就是我所假设的),并将值设置为包含一个元素的新列表。

如果密钥尚不存在,代码的作用是创建一个包含新单值的列表,或者如果该值已经存在,则将该值添加到现有列表中。

除非使用defaultdict,否则无需尝试/可以实现相同的效果。 defaultdict有效地将这个逻辑包装在其中。

答案 1 :(得分:0)

显然clustersdict,其值是列表。如果密钥bestmukey存在,此代码会尝试附加到此类列表,但如果密钥不存在,则会添加密钥并启动列表。

通常最好使用defaultdict

答案 2 :(得分:0)

语句#2中的

clusters[bestmukey] = ...将写入clusters[bestmukey],无论是什么(它被称为左值,左值,你指定的东西)。但是,声明#1中的clusters[bestmukey]是一个右值(不是你指定的),而且在Python中它需要存在,否则就会出错。即使你没有收到错误(比如Ruby或其他语言),你也不会得到append *上的内容,所以声明#1不适用。


*)您可以使用defaultdict。但这是另一个故事。