【问题标题】:how does "list.append(val) or list" work?“list.append(val) or list”是如何工作的?
【发布时间】:2021-12-18 04:20:53
【问题描述】:

在寻找如何允许列表 append() 方法返回新列表时,我偶然发现了这个解决方案:
list.append(val) or list
它非常好,适用于我的用例,但我想知道它是如何做到的。

【问题讨论】:

  • 信不信由你,return list.append(val) or listlist.append(val); return list 更多的代码(因此更慢)
  • 不要这样做,这太荒谬了。 list.append总是返回None。你正在利用这个事实。但只需使用两个单独的语句。
  • 我可以看到一些你可能想要这样做的罕见情况,比如一个深度嵌套的表达式,你需要在发生一件事之前附加列表,但在另一件事发生之后,但在这种情况下,表达式本身应该大概是被拆散了。毕竟,Python 不是一种纯粹的函数式语言。例如,foo(bar(baz(), list.append(val) or list)) 可能与list.append(val); foo(bar(baz(), list)) 不同,因为它改变了调用list.appendbaz 的顺序。
  • @chepner 让我这样说,我无法想象任何涉及此的代码通过任何理智的代码审查
  • 只是说理智地重写它可能不像仅仅添加一条额外的语句那么简单。

标签: python python-3.x list append


【解决方案1】:
x=[1]
s=None
print(x or s) #prints: [1]

对于任何将来的参考,这就是它的工作原理。
使用 x.append(2) or x,它将附加值,然后在比较时返回这两者之间的True语句,即列表x=[1,2]

【讨论】:

    【解决方案2】:

    list.append(val)返回None,这是一个假值,所以整个表达式的值是list。如果list.append 返回一个真值,那将是or 表达式的值。

    【讨论】:

      【解决方案3】:

      list.append(val) 返回 None,这是 Falsy,因此触发 or 并返回列表。尽管如此,我认为这不是pythonic,只需在没有or的情况下制作两条单独的行

      【讨论】:

      • 我同意这不是pythonic,尽管它很聪明。
      • @j1-lee 我什至不明白为什么这很聪明。
      • 所以当它进入 OR 语句时,列表已经附加了 val 并且由于列表不是“无”,它返回列表,因为它是一个“真”语句?
      • @VlaryNottellu 是的,你明白了 :)
      • @Chris_Rands 太聪明了,我在 return 语句中的递归函数中使用它,这就是我想使用这种情况的原因。
      猜你喜欢
      • 2011-08-01
      • 2021-05-24
      • 1970-01-01
      • 2015-07-18
      • 2013-08-08
      • 2011-07-07
      • 2016-11-09
      • 2016-02-11
      • 2011-04-07
      相关资源
      最近更新 更多