【发布时间】:2017-08-15 22:35:10
【问题描述】:
我希望扩展一个列表并拥有以下内容
ListA = list(x)
ListB = list(y)
ListC = ListA.extend(ListB)
这使ListC 拥有<type 'NoneType'>,我想知道为什么这不仅仅是一个列表。
谢谢!
【问题讨论】:
-
因为
extend(..)工作就地。它确实不返回任何东西。您也可以使用listA + listB创建组合列表。 -
嗯,它返回
None,这是什么,对吧? ;) 我认为这里最重要的一点是(通常)python 类型上的方法要么修改实例的状态 要么 返回一个 not-None的东西(不是两者)。extend修改状态(通过扩展列表ListA)并因此返回None。 -
@MSeifert
list.pop和dict.setdefault例如既可以修改状态又可以返回一些东西。 -
@StefanPochmann 我想到了它们(还有
dict.pop和dict.popitem)作为“特殊情况”并引用禅宗:Special cases aren't special enough to break the rules. Although practicality beats purity.也许这些被认为是“实用的”?:) -
@MSeifert 顺便说一句,我认为“规则”无效。也许对于建设性的方法,但不是对于破坏性的。对于破坏性的,我认为返回破坏的数据是非常合适的。每次我必须在 C++ 堆栈上同时使用
top和pop时都会让我生气。