【问题标题】:Why when I extend a list does it have 'NoneType' as type?为什么当我扩展列表时它的类型为“NoneType”?
【发布时间】: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.popdict.setdefault 例如既可以修改状态又可以返回一些东西。
  • @StefanPochmann 我想到了它们(还有 dict.popdict.popitem) 作为“特殊情况”并引用禅宗:Special cases aren't special enough to break the rules. Although practicality beats purity. 也许这些被认为是“实用的”?:)
  • @MSeifert 顺便说一句,我认为“规则”无效。也许对于建设性的方法,但不是对于破坏性的。对于破坏性的,我认为返回破坏的数据是非常合适的。每次我必须在 C++ 堆栈上同时使用 toppop 时都会让我生气。

标签: python list extend


【解决方案1】:

extend 与许多其他列表操作一样,就地操作并返回 None。 ListA 被额外的元素修改了。

【讨论】:

    【解决方案2】:

    您没有将 ListC 定义为列表类型。

    如你所知,list() 是一个函数;生成一个列表类型。

    list.extend 没有。相反,它会修改给定的列表。

    再次查看您的代码。

    ListA = list(x) ## You defined ListA as a list type; with list(x). 
    
    ListB = list(y) ## You defined ListB as a list type; with list(y). 
    
    ListC = ListA.extend(ListB) ## ListC is not defined as a list type. 
    

    因此,ListC 返回 NoneType。

    很高兴您注意到 + 和 list.extend() 之间的区别。继续努力,祝你好运。

    【讨论】:

    • 我不确定您的解释是否足够清楚。 ListC 已定义,并分配给ListA.extend(ListB) 的结果。扩展的结果总是None,因为它“就地”改变了可变对象。一切取决于实际调用:list.extend 更改现有对象,ListA+ListB 返回一个新列表
    • 你是对的。我的意思是 ListC 没有被定义为“列表类型”。我刚刚编辑。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多