对象有价值但似乎不存在?

use*_*629 1 python evaluation if-statement truthiness

我有以下Python代码:

if bedrooms: # bedrooms exists
    .....
else: #  BEDROOMS DOES NOT EXIST 
    bn = "BEDROOMS DOES NOT EXIST"
Run Code Online (Sandbox Code Playgroud)

我在我的调试器中单步执行它,并注意到即使bedroom == 0流程跳转到else语句.

为了测试这个我试过:

>>> bedrooms
0.0
>>> type(bedrooms)
<type 'float'>
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?

iCo*_*dez 6

0始终False在Python中求值:

>>> bool(0)
False
>>> bool(0.0)
False
>>> not 0
True
>>>
Run Code Online (Sandbox Code Playgroud)

因此,这样做:

if 0:
    ...
else:
    ...
Run Code Online (Sandbox Code Playgroud)

将始终导致else块被执行.

有关评估结果的完整列表False,请参阅Python文档中的真值测试.


如果要检查是否bedrooms已定义,则可以使用try/except块和catch来获取NameError(当使用不存在的名称时会引发该块):

try:
    bedrooms
except NameError:
    # bedrooms is not defined
Run Code Online (Sandbox Code Playgroud)

但这就引出了为什么你需要首先做到这一点的问题.如果它涉及动态变量名,那么我想说这些被大多数Python程序员认为是一种不好的做法,应该避免.它们很快就会导致维护问题,并且很容易忘记创建的名称.