算数 > 位 > 身份 > 成员 > 逻辑
In [2]: 1//2 Out[2]: 0 In [3]: 2//1 Out[3]: 2
除以2的整数倍
In [1]: 32 // 4 Out[1]: 8 In [2]: 32 >> 2 Out[2]: 8
比较变量的取值是否相等,不是内存地址
In [8]: 4 > 3 > 2 Out[8]: True In [9]: 4 > 5 > 2 Out[9]: False
not > and > or
In [10]: a = min(3, 4) In [11]: a Out[11]: 3
is 比较的是两个变量的身份是否相等,即是否为同一个对象,内存地址是否相等
如果是数字比较,使用==
与None比较时,使用is
对于整型数字来说, a is b 为true的结论,只适用于-5到256范围内的数字
In [1]: a1 = 256 In [2]: a2 = 256 In [3]: b1 = 257 In [4]: b2 = 257 In [5]: id(a1) Out[5]: 4327773952 In [6]: id(a2) Out[6]: 4327773952 In [7]: id(b1) Out[7]: 4359476880 In [8]: id(b2) Out[8]: 4360330800 In [9]: a1 is a2 Out[9]: True In [10]: b1 is b2 Out[10]: False
出于对性能优化的考虑,Python内部会对-5到256的整型维持一个数组,起到一个缓存的作用。这
样,每次你试图创建一个-5到256范围内的整型数字时,Python都会从这个数组中返回相对应的引用,而不
是重新开辟一块新的内存空间。上述例子中的257,Python则会为两个257开辟两块内存区域
==
比较 is比较操作符'is'的速度效率,通常要优于'=='。因为'is'操作符不能被重载,这样,Python就不需要去寻找,程序中是否有其他地方重载了比较操作符,并去调用。执行比较操作符'is',就仅仅是比较两个变量的ID而已。
但是'=='操作符却不同,执行a == b相当于是去执行a.__eq__(b)
,而Python大部分的数据类型都会去重载__eq__
这个函数,其内部的处理通常会复杂一些。比如,对于列表,__eq__
函数会去遍历列表中的元素,比较它们的顺序和值是否相等。
元组是不可变的,但元组可以嵌套,它里面的元素可以是列表类型,列表是可变的,所以如果我们修改了元组中的某个可变元素,那么元组本身也就改变了,之前用'is'或者'=='操作符取得的结果,可能就不适用了。
前缀加0b
In [5]: 0b10 Out[5]: 2 In [6]: 0b11 Out[6]: 3
前缀加0o
In [7]: 0o10 Out[7]: 8 In [8]: 0o11 Out[8]: 9
十六进制
前缀加0x
In [14]: 0x10 Out[14]: 16 In [15]: 0x1F Out[15]: 31