x 是一个元组: (x1, x2)
try:
clusters[bestmukey].append(x) # statment 1
except KeyError:
clusters[bestmukey] = [x] # statement 2
(1) 语句 1 和语句 2 如何做不同的事情?
(2) 为什么需要分隔语句?
clusters[bestmukey].append(x)
要求clusters[bestmukey]
已经存在并且是可以附加到的列表。如果clusters
没有正确的密钥,这将引发 KeyError。
clusters[bestmukey] = [x]
将始终有效(只要clusters
是字典,这是我的假设),并将值设置为具有一个元素的新列表。
代码的效果是,如果键不存在,则使用新的单个值创建一个列表,或者如果它已经存在,则将该值添加到现有列表中。
不使用 try/except 也可以使用defaultdict
. defaultdict 有效地将这个逻辑包装到自身中。
显然clusters
是一个dict
其值是列表的。如果键存在,此代码会尝试附加到这样的列表bestmukey
,但如果不存在,它会添加键并启动一个列表。
通常最好使用defaultdict
clusters[bestmukey] = ...
clusters[bestmukey]
在语句 #2 中,无论如何都会写入(它被称为左值、左值、您分配给的东西)。然而,clusters[bestmukey]
在语句#1 中是一个右值(不是你分配的东西),并且在 Python 的头脑中它需要存在,否则你会得到一个错误。即使您没有收到错误(例如在 Ruby 或其他语言中),您也不会得到您可以append
on* 的东西,因此声明 #1 不适用。
*) 您可以使用defaultdict
. 但那是另一回事了。