前段时间微信朋友圈里有个朋友问了这样一个问题:
当时看到这个问题之后就开始想,为什么会有这样不同的结果呢?
分析一下:
python中“is”是用来判断是否是同一个对象的,另一个操作符“==”是判断对象的值是否相等。既然“is”是判断是否是同一个对象的,那么“is”是如何判断两个变量是不是同一个对象呢,查阅文档了解到,is判断的是两个变量是不是在内存中分配了同一块区域,每一块区域有唯一的id。
如何获取到这个id呢,python中id()函数可以获取到这个id值,所以下面来看一下上面的a和b是不是同一个id:
可以看到当 a = "wtf",b = "wtf"的时候这两个是同一个对象,有着相同的id,但是当a = "wtf!", b = "wtf!"的时候这两个的id就不一样了,因此就出现了文章开头的那个问题。
那么为什么当 a = "wtf",b = "wtf"的时候是同一个id,而当a = "wtf!", b = "wtf!"的时候就不是同一个id了呢?这里涉及到了python对字符串内存分配的问题了。
之所以会有第一个现象即a = "wtf",b = "wtf"的时候 a is b 返回true,原因是CPython(C语言实现的Python解释器)对字符串做的优化,即python中字符串intern机制,这个机制就是:字符串不是在python启动时就初始化好的,而是在代码中a=“wtf”的时候创建的,但python会把创建的字符串放在一个缓冲池里面,之后创建相同字符串的时候, 就会直接返回,所以a =“wtf”; b =“wtf”的时候,a和b是同一个对象, 也就是 a is b返回true。另一方面,如果字符串中含有非字母,数字,下划线的话是不会执行该机制的,也就是说因为a="wtf!"中含有“!”,所以虽然这两个值是相等的,但是python解释器为这两个分配了不同的内存地址,从而id也就不一样了,因此当a = "wtf!", b = "wtf!"的时候就返回false了。
上面是个人的一些对这个问题的想法和分析,有不准确的地方还望多多指教!
网友评论