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)