Python 列表理解中的零意外替换

Unexpected replacement of zero in Python list comprehension

我正在查看一个 Whosebug 问题 (if else in a list comprehension) 并决定尝试以下行

[ a if a else "Exception" for a in range(10) ],

得到以下列表

[ "Exception", 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

作为输出。我原以为输出是

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

因为零本身,就像其他数字被评估一样。想测试该行为是否只影响第一个索引,我尝试了

[ a if a else "Exception" for a in range( 1, 10 ) ]

输出

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

如果行为特定于第一个索引,那是我没有预料到的。鉴于目前的结果,我尝试了以下想法,认为 0 在可迭代对象中有一些特别之处。

[ a if a else "Exception" for a in [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]

import numpy [ a if a else "Exception" for a in numpy.zeros(10) ]

这两种情况的结果如下

[ "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception", "Exception" ]

如果有人能向我解释这种行为,我将不胜感激。 似乎 0 处于可迭代对象中可能会触发意外行为,但我对这个结论没有信心。

Python 将 0 视为假,将任何其他数字视为真。

亲自尝试一下:

if 0: print("0 is false")
if 1: print("1 is true")
if 2: print("2 is true")

你得到的输出是:

1 is true

2 is true

您的列表压缩表示的是:

"For each number from 0 to 9, if a is true, add a to the list, if a is false, add "列表中的“例外”

因为 0 被视为 False,所以 0 得到 "Exception",然后所有其他数字得到 1 2 3... 等等。

这是因为 0 在 python 中的计算结果为 False。所有其他数字将评估为 True 并因此放置在列表中。

我们来看看这个。

[ a if a else "Exception" for a in range(10) ]

range(10) 计算结果为 0,1,2,3,4,5,6,7,8,9

0 -> False

所有其他号码 -> True

0 是被视为 False 的数字类型之一,与 [] Empty List 和许多其他类型相同,因此在列表压缩的表达式中, 0 是一个False 导致 Exception 字符串

结果的条件

你可以用IDLE查看:

>>> bool(0)
False
>>> bool(1)
True
>>> bool([])
False
>>> bool([1,2])
True