Vincent
2022-02-28 08:21老師,關(guān)于身份運算符想問下,同樣的列表、元組、集合、字典為何is判斷是false的原因是什么?他們的id為何不一樣
所屬:AQF > AAQF 視頻位置 相關(guān)試題
來源: 視頻位置 相關(guān)試題
1個回答
高志萍助教
2022-02-28 10:03
該回答已被題主采納
同學(xué)你好,
==是判斷兩者的值是否一樣
is是判斷兩者的id是否相同
id不同的原因:
分配【內(nèi)存塊】的值的規(guī)定造成。
a=123
計算機的邏輯是,先發(fā)分配一個【內(nèi)存塊】,這個【內(nèi)存塊】會儲存整型123,然后將變量a指向這個【內(nèi)存塊】
整數(shù)123會停留在其初始占據(jù)的【內(nèi)存塊】中,直到內(nèi)存垃圾回收機制將它釋放為止。
b=123
因為已經(jīng)有一個123這個整型已經(jīng)放在一個【內(nèi)存塊】了,所以b就同樣指向這個內(nèi)存塊了。
那a和b的id 是一樣,簡答的說只要整形在-5到256之間的,他們的id都是一樣的,超過-5到256,是打開python,默認初始化好的短整形,257開始就是長整形了,這個時候沒有初始化過,所以每次輸入257的時候,都會分配一個【內(nèi)存塊】,那他們的id就是不一樣的 (圖一)
a=257
b=a
這個的邏輯是,將變量b指向變量a,那b和a是一樣的東西,所以他們是一個【內(nèi)存塊】,所以id是一樣的(圖二)
那同樣的,不管是list還是tuple
如果是a=b,那就是用的一樣的【內(nèi)存塊】,id 相同,is是ture
但是如果是
a=【10,20,30】
b=【10,20,30】
邏輯,先獲得一個【內(nèi)存塊】,再把初始化的短整型【內(nèi)存塊】,也就是10,20,30,放入這個【內(nèi)存塊】,然后將變量a指向這個模塊
b也是一樣,也是先獲得一個【內(nèi)存塊】。然后放入短整型【內(nèi)存塊】。
所以不管a和b的內(nèi)容一樣不一樣,他們是兩個短整型【內(nèi)存塊】,所以他們的id是不同
但是如果我們看兩個列表里的元素的話,因為他們是短整形,所以是一樣的
也就是a【0】的id和b【0】的id是一樣的(圖三)
除了短整形,字符串(英語,中文不行)也是一樣的
個人理解:我認為短整型和英語基礎(chǔ)的字符串,是系統(tǒng)默認好的內(nèi)存塊,也就是基礎(chǔ),之后的元祖,字典,列表之類的都是基于短整型和字符串的,所以如果是只涉及短整型和英語基礎(chǔ)的字符串,那id就是一樣的。而如果是在短整型和英語基礎(chǔ)的字符串之上又有其他操作的話,那就是新分配到的內(nèi)存塊,所以不管內(nèi)容一樣不一樣,但是內(nèi)存卡是有不一樣的,所以id不同
-
追答
補充一個,關(guān)于字符串的截圖
