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
我正在查看一个 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