关于is和id()的疑惑
id()的官网描述:
返回对象的“身份”。这是一个整数,可以保证在此对象的生存期内唯一且恒定。具有不重叠生命周期的两个对象可能具有相同的id() 值。
is的官网描述
x is y : 当且仅当x和y是同一对象时才为true 。使用该功能确定对象的身份
从is的描述可以知道,如果x is y == True , 那么x和y指向的对象,肯定是同一个对象,而从id的描述可知,每个对象在其生存期都有一个唯一的‘身份’(id)
所以x和y的id必定相同
那么反过来,如果x 和 y的id相同,它们一定是同一个对象吗?
下面一句话给出了答案:
‘具有不重叠生命周期的两个对象可能具有相同的id() 值’
去掉修饰部分:两个对象可能具有相同的id() 值
怎么理解‘不重叠的生命周期’?
当对象被创建时,内部机制会为其分配内存空间。
如果在对象占用内存期间,创建另一个对象,系统又会为新的对象分配新的内存空间,那么它们的生命周期就是重叠的(因为同一时间里它们都占用着内存空间——占用内存的时间即为生命周期),因为分配的内存空间不同(指向不同的内存地址),这两个对象的id自然就不可能相同。
如果对象从内存释放,那么创建另一个对象时,它们的生命周期就是不重叠的,那么分配给前一个对象的内存空间就可能被复用,也就会造成不同的对象引用了同一个 id
所以采用id来判断两个对象是否是同一个对象,可能会得到不准确的结果。
如果非要用id进行判断,可以将两个对象分别绑定到变量名上,使两个对象的生命周期重叠再进行判断。