关于Python整数比较的一些�:
Pythonä¸ä¸€åˆ‡éƒ½æ˜¯å¯¹è±¡ï¼Œå¯¹è±¡æ¯”较å�¯ä»¥ç”¨ == 或者 is。== 比较的是两个对象的内容是å�¦ç›¸ç‰ï¼Œé»˜è®¤ä¼šè°ƒç”¨å¯¹è±¡çš„ __eq__() 方法。
is 比较的是两个对象的 id 是å�¦ç›¸ç‰ï¼Œä¹Ÿå°±æ˜¯æ˜¯å�¦æ˜¯å�Œä¸€ä¸ªå¯¹è±¡ï¼Œæ˜¯å�¦æŒ‡å�‘å�Œä¸€ä¸ªå†…å˜åœ°å�€ã€‚
>>> a = 4 >>> b = 4 >>> a == b True >>> a is b True >>> a = 256 >>> b = 256 >>> a == b True >>> a is b True >>> a = 257 >>> b = 257 >>> a == b True >>> a is b False
我们看到,å‰�å‡ ç»„æ¯”è¾ƒæˆ‘ä»¬éƒ½å�¯ä»¥ç�†è§£æ˜¾ç¤ºçš„结果,但是最å�Žå½“ a/b 都指å�‘ 257 这个整数对象的时候,用 is 比较以å�Žçš„结果是 False。
è¿™æ˜¯å› ä¸º Python 处于对性能的考虑,内部作了优化,对于整数对象,把一些频ç¹�使用的整数对象缓å˜èµ·æ�¥ï¼Œä¿�å˜åˆ°ä¸€ä¸ªå�« small_ints 的链表ä¸ã€‚
在 Python 整个生命周期ä¸ï¼Œä»»ä½•需è¦�引用这些整数对象的地方,都ä¸�å†�é‡�新创建新的整数对象,范围是 [-5,256]。
å†�看下é�¢è¿™ä¸ªä¾‹å� :
>>> a = 259 >>> def foo () : ... b = 259 ... c = 259 ... print(a is b) ... print(b is c) ... >>> foo() False True
è¿™æ˜¯å› ä¸º Python 程åº�都是由代ç �å�—æž„æˆ�,代ç �å�—作为程åº�的一个最å°�基本å�•ä½�æ�¥æ‰§è¡Œã€‚一个模å�—文件/一个函数体/一个类/交互å¼�命令ä¸çš„å�•行代ç �都å�«å�šä¸€ä¸ªä»£ç �å�—。
上é�¢çš„程åº�䏿œ‰ä¸¤éƒ¨åˆ†ä»£ç �å�—,一个是å��ç§° a 所在的代ç �å�—,一个是å��ç§° b/c 所在的代ç �å�—。Python çš„å�¦ä¸€ä¸ªä¼˜åŒ–的地方就是,如果在å�Œä¸€ä¸ªä»£ç �å�—ä¸åˆ›å»ºçš„两个整数对象ä¸ï¼Œå®ƒä»¬çš„值相ç‰çš„è¯�,那么这两个对象引用å�Œä¸€ä¸ªæ•´æ•°å¯¹è±¡ã€‚所以Python出于对性能的考虑,但凡是ä¸�å�¯å�˜çš„对象,在å�Œä¸€ä»£ç �å�—ä¸ï¼Œå�ªæœ‰å€¼ç›¸ç‰çš„对象就ä¸�会é‡�å¤�创建,而是直接引用已ç»�å˜åœ¨çš„对象。ä¸�仅整数对象,å—符串对象也é�µå¾ªå�Œæ ·çš„原则。