所有运算符只干两件事中的一件——要么造出一个值,要么问出一个 True/False。
几个重点注意:
①切勿把=读成「等于」
数学课上,= 表示左右两边相等,是一个静态的、陈述性的符号。Python 里的 = 是一个动作:把右边的值装进左边那个变量。
拆这个陷阱,光解释没用,要改读法。统一读成「赋值给」,认知就会跟着改。
对照一下就清楚了:
x=10# 把 10 装进 xx=x+5# 先把右边算出来(15),再装回 xprint(x)# 15x+=5# 等价于 x = x + 5print(x)# 20+=这张表在教材里通常有八行(=、+=、-=、*=、/=、//=、%=、**=),看着吓人,其实只说一句话就够:
除了“=”,其余每一个都是「在原来的基础上做一次运算,再把结果存回去」。
②is 跟 == 不是一回事==理解为「长得一样」is理解为「是不是同一个人」。
a=[1,2]b=[1,2]c=aprint(a==b)# True 内容一样print(aisb)# False 但不是同一个盒子print(a==c)# Trueprint(aisc)# True 就是同一个盒子a.append(3)# 往这个盒子里再放一个 3print(b)# [1, 2] b 没受影响print(c)# [1, 2, 3] c 跟着变了最后两行最有说服力:我只往 a 里加了一个 3,c 跟着变了,b 没变。因为 c 和 a 根本是同一个盒子,只是有两个名字;b 是另一个盒子,凑巧装了一样的东西。
所以:
==问的是「装的东西一样吗」,is问的是「是不是同一个盒子」。
③逻辑短路规则
逻辑运算符的表面规则两句话就说完:and是「而且」,两边都真才是真;or是「或者」,有一个真就是真。
短路:and只要发现左边是假的,右边根本不看,直接收工。
x=0print(x!=0and10/x>1)# False 没报错,因为右边没算print(10/x>1)# ZeroDivisionError 去掉保护,立刻崩第一行里明明有10 / x,而x是 0。除以 0 在 Python 里是会崩的——第二行就崩了。但第一行老老实实输出了False。
为什么?因为and看到左边x != 0是假的,就停下来了。左边已经注定是假,右边无论是什么都改变不了结果,所以 Python 干脆不算。
一句话记住:
and撞到假就收工,or撞到真就收工,后面的代码一律不执行。