Python for循环内赋值语句的and-or表达式含义是什么?
问题解答
1. Python中and/or的作用
- 二者是Python内置的布尔运算符,不限制只能在if-else分支中使用,可以在任意表达式场景使用,最终会返回参与运算的实际值,同时支持短路求值规则:
a and b:如果a被判定为假,直接返回a的值,不会计算b;如果a为真,返回b的计算结果a or b:如果a被判定为真,直接返回a的值,不会计算b;如果a为假,返回b的计算结果
- 补充判定规则:Python中数值0、空字符串、None、空容器都会被判定为假,其余值为真。这种
and/or组合的写法在Python旧版本中常用来替代三元表达式,逻辑更简洁。
2. 赋值语句逻辑拆解
你用到的赋值语句:
m[i] = m[i-1] and p[i-1] == '*' or (i > 1 and m[i-2] and p[i-1] == '*')
由于Python中and的运算优先级高于or,所以代码会先分别计算or左右两边的and组合表达式,再对两个结果做or运算,等价于如下判断逻辑:
两个条件满足任意一个则
m[i]为真,否则为假:
- 前一位的
m[i-1]为真,且当前遍历到的字符串字符p[i-1]是*- 遍历索引i大于1、前两位的
m[i-2]为真,且当前遍历到的字符串字符p[i-1]是*
也可以用三元表达式写为完全等价的版本,逻辑更直观:
m[i] = True if (m[i-1] and p[i-1] == '*') or (i>1 and m[i-2] and p[i-1] == '*') else False
3. 运行结果验证
你的初始m列表全为0(0在布尔判定中为假),逐轮遍历结果和你给出的输出完全匹配:
- i=1:
m[0]是0,第一个and直接返回0;i>1不成立,括号内整体为假,所以0 or 假返回False→m[1]=False - i=2:
m[1]是False,第一个and返回False;i>1成立但m[0]是0,括号内and返回0,所以False or 0返回0 →m[2]=0 - i=3:
m[2]是0,第一个and返回0;m[1]是False,括号内返回False →0 or False返回False→m[3]=False - 后续遍历逻辑完全一致,始终没有触发为真的条件,最终输出结果为
[0, False, 0, False, 0, False]
内容的提问来源于stack exchange,提问作者Troy Bear
相关产品推荐
相关产品推荐

