can Python';和';不返回?

can Python';和';不返回?,python,python-3.x,Python,Python 3.x,我正在看一些显然运行的代码,因为没有人抱怨过它,但他们写的东西让我很困惑: if a and b is not None: # do something 我一直认为and运算符是返回True或False的运算符,现在我开始怀疑自己。。它还会返回什么,一个数字。。这可能不是pythonic,但我是否遗漏了一些东西-怎么会有人写这样的东西呢?上面的代码意味着: 如果a(是真实的,b不是None,那么#在这个代码中做点什么,首先计算b不是None,这是一个布尔值 然后,a被隐式转换为布尔值

我正在看一些显然运行的代码,因为没有人抱怨过它,但他们写的东西让我很困惑:

if a and b is not None:
    # do something
我一直认为and运算符是返回True或False的运算符,现在我开始怀疑自己。。它还会返回什么,一个数字。。这可能不是pythonic,但我是否遗漏了一些东西-怎么会有人写这样的东西呢?

上面的代码意味着:


如果
a
(是真实的,
b
不是
None
,那么
#在这个代码中做点什么
,首先计算
b不是None
,这是一个布尔值

然后,
a
被隐式转换为布尔值 (对于
列表
/
目录
,如果为空,则为
。对于数字,如果为0,则为


然后计算始终返回布尔值的

这意味着如果
a是真的
b不是无的
,并且不是您认为的意思,即
a和b是真的

a = 999
b = None

if a and b is not None:
    print("a is True but b is None")
else:
    print("a is True and b is not None")
根据(重点是我的):

下表总结了Python中运算符的优先级,从最低优先级(最少绑定)到最高优先级(最多绑定)

...
and                                                 Boolean AND
not x                                               Boolean NOT
in, not in, is, is not, <, <=, >, >=, !=, ==        Comparisons, including membership tests and identity tests
...
此外,根据:

任何对象都可以测试真值,用于or条件,或作为下面布尔运算的操作数

您的if语句完全正常(生成bool)

示例(使用):


这肯定是正确的

当我们获取一个已赋值的变量并使用另一个空变量(在python中为-None)执行操作时,操作将导致。因此,可以进行检查。为了阐明我的观点,请参阅下文

a=2;c=None; b=11
if a and c is not None:
    print("T")
else:
    print("F")

结果为


结果为非空值-在我们的例子中,11

空列表的计算结果为
False
,不是吗?这不是一个非类型的我想?我在看答案。。如果(a和b)不是无:
和想象中的括号可能不在那里。@cardamom正确,它们不是小标题,
a是真的
=>
a
是真的truthy@NickA哈,是的你上一次陈述的结果很有趣。。我真的认为“and”只返回True或False,但它的工作原理似乎有点不同,你通常不会注意到,因为它是在“if”语句中。谢谢,这两个链接非常有用。我希望人们能把它放在括号里。那个“运算符优先级”表比我们在学校里学的算术要差。我注意到PyCharm并不反对你把它放在(多余的)括号里,所以它不可能是不好的风格,也不确定它是好是坏。不客气。每个语言(包括算术)的运算符优先级都在一个表中,我不确定是否有一种用户友好的方式可以表示为。我在PEP8中没有看到禁止多余括号的注释,但我认为在不清楚的地方使用括号是有意义的。
>>> bool(0)
False
>>> bool(100)
True
>>> bool([])
False
>>> bool([0])
True
>>> bool(None)
False
>>> bool({})
False
>>> bool({1: 1})
True
>>> bool(None is not None)
False
>>> bool(1 is not None)
True
>>> bool(2 and 1 is not None)
True
a=2;c=None; b=11
if a and c is not None:
    print("T")
else:
    print("F")
print(a and c)
print(a and b)