【问题标题】:Unexpected behavior with list.appendlist.append 的意外行为
【发布时间】:2015-02-03 04:05:35
【问题描述】:

我正在与我的解释器一起找出 Python append() 方法的行为并发现:

In [335]: b = [].append(1)

In [336]: b

In [337]: 

In [337]: b = [].append('1')

In [338]: b

这让我感到困惑,因为我认为每当我们在列表上调用 append() 时,我们都会在其末尾添加新对象,所以不应该在空列表上调用 append()(就像我在上面所做的那样)给我我可以达到的结果相同:

In [339]: b=[] 

In [340]: b.append(1)

In [341]: b
Out[341]: [1]

我在这里可能有一个误解,所以如果我错了,请纠正我。

【问题讨论】:

    标签: python list append ipython


    【解决方案1】:

    这让我很困惑,因为我认为每当我们在 列表,我们在其末尾添加新对象

    没错。但是您忘记了append()(就像大多数改变对象的方法一样)在Python中总是返回None,因为它就地运行。所以,这样做:

    b = [].append(1)
    

    等同于:

    b = None
    

    1 技术上已添加到列表 [],但在调用 append() 后无法访问此列表,因为 b 已分配给方法调用的返回值。

    第二个示例运行良好,只是因为您没有重新分配 b 并因此丢失了对列表对象的引用。

    【讨论】:

    • 哦,对了。嗯,有什么理由可以让apppend() 返回None?是不是因为像第二个例子一样,当我做b.append()时,如果append()没有返回None,那么它会修改b的类型并改变它的值?因为现在在我看来,如果append() 总是返回None,那么在b 上调用append() 也会导致b 的值更改为None,即使在第二个示例中也是如此。我在这里有什么误解?
    • 我相信理由是它强制简单和明确。您必须一次只做一件事,并避免冗长的意大利面条式陈述以及一系列副作用。
    • @AKKO - 好吧,你必须向 Python 核心开发人员询问append() 返回None确切 原因。这实际上只是一个设计决定。我猜是这样你就不能把电话埋在另一条线上。由于append() 改变了列表,它应该在自己的行上引起注意。事实上,几乎所有在 Python 中改变对象的方法都遵循这个约定并返回 None
    • 感谢@iCodez @tripleee 的回复。我想这澄清了一切。我在上面的评论中找到了我自己问题的答案:然后在 b 上调用 append() 也应该导致 b 的值更改为 Noneb 将始终是一个列表,当我执行type(b.append(1)) 时,执行b.append(1) 之类的操作本身会给我一个NoneTypeb 本身的类型不会被修改。但是,假设我要为表达式a = b.append(1) 分配一个变量,那么a 的类型将是NoneType。我猜这是 R 值和 L 值的问题。
    【解决方案2】:

    append 是一个不返回任何内容的方法。所以调用ls.append(1) 会将1 附加到ls 的末尾,但ls.append(1) 没有实际值。所以设置b = [].append('1')b 设置为None

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2020-10-04
      • 2016-07-16
      • 2016-05-10
      • 2020-07-23
      • 2021-08-23
      • 2021-11-16
      • 2017-10-20
      • 2016-06-29
      相关资源
      最近更新 更多