说到 Python 里的 is 和 ==,很多人第一反应是:“不就是一个判断相等、一个判断是不是同一个对象嘛,有啥可聊的?”确实,表面看起来没什么神秘的,但真要在面试里聊清楚、写代码不踩坑,还真得拆开说说,尤其是那些隐藏的细节,平时不注意就可能让你“线上翻车”。
先说个直白的定义,== 比较的是两个对象的“值”是不是相等,而 is 比较的是两个对象的“身份”是不是一样,也就是它们是不是同一个内存地址的实例。用人话说就是,== 像是在问“咱俩长得一样不?”,而 is 则是在问“你就是我本人吗?”
比如这段小代码:、
这就很好理解,a 和 b 虽然长得一样(值相同),但它们是两个不同的列表对象,is 肯定不成立。但是坑就坑在,有些时候 Python 会在幕后帮你“省事”,它觉得两个值一模一样,干脆就让它们指向同一个对象,这样节省内存,这就是所谓的 对象缓存机制。最常见的例子就是小整数缓存和短字符串驻留(interning)。
很多人第一次被坑,就是在字符串比较的时候偷懒用 is,结果测试的时候没问题,线上来了个不一样的情况直接挂了。再说一个常见误区,就是一些“可变对象”和“不可变对象”的差别。is 在可变对象上判断身份很重要,因为它们值可能会变。如果你用 == 判断字典或者列表,值一样也会通过,但这不代表它们真的是同一个对象。比如:
在这里,a 和 b 是同一个对象,所以改一个另一个也跟着改。用 is 就能发现这种情况。而对于不可变对象,比如 int、str、tuple,值一旦创建就不能改,所以你一般不关心它们是不是同一个对象,用 == 就足够。面试的时候,有些考官会故意给你一些“边界值”测试,比如:
这样写比 x == None 要好,因为后者在某些奇怪的对象实现里可能被重载掉 __eq__,导致比较结果不符合预期。说实话,这个知识点看着小,但在面试里经常是用来判断你是不是对 Python 内存模型和对象机制有底层理解的。如果你回答只是“一个比值,一个比身份”,那就太表面了,最好能顺带讲讲小整数池、interning、以及可变不可变对象的行为差别,这样才能显得你是真懂。如果你愿意,我们还可以用几段更“诡异”的例子,把这个坑挖深,比如涉及 is、==、id()、以及 sys.intern() 的组合玩法,那才是 Python 面试里的黑魔法级别。这样的话,不仅能让面试官满意,还能防止自己以后踩坑。
以上就是“Python 中 is 和 == 的区别,什么时候会出现“坑”?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/13379/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料