第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 id([1][::-1]) ==id([1]) 返回 True 而 [1][::-1]

為什么 id([1][::-1]) ==id([1]) 返回 True 而 [1][::-1]

HUX布斯 2023-12-29 15:02:57
我知道is運算符比較id兩者的值,而不是值,但為什么在返回時id([1][::-1])==id([1])返回?True[1][::-1] is [1]Falseid([1][::-1]) ==id([1]) #True[1][::-1] is [1] #Fasleid([1]) ==id([1][::-1])#Fasle[1] is [1][::-1]#False
查看完整描述

1 回答

?
皈依舞

TA貢獻1851條經(jīng)驗 獲得超3個贊

id([1][::-1]) ==id([1])beingTrue是 CPython 的一個怪癖,它使用一個空閑列表來將lists 實現(xiàn)為堆棧。第一個id([1][::-1])被完全評估,并且list它生成的內(nèi)容在完成時被釋放。當[1]為 new 分配空間時list,它會在同一地址處獲得相同的內(nèi)存,這(在 CPython 中)相當于它的id.

id僅當對象存在時才保證 s 是唯一的;list因為在創(chuàng)建新的之前原始的已經(jīng)消失了list,所以如果它們id在稍微不同的時間點具有相同的 s ,則不會違反任何保證。

測試的順序很重要,因為id它本身是從小對象分配器中最近釋放的塊集中拉出的。這里的順序是:

  1. 原件[1]分配在地址A

  2. 的結(jié)果[::-1]分配在地址B

  3. 此后,[1]分配 A 立即返回到 的list空閑列表中

  4. id返回int描述地址 B

  5. B的結(jié)果[::-1]返回到空閑列表(在 A 之前)

  6. 第二個[1]是分配,獲取 B,之前使用的內(nèi)存[::-1]

  7. id被調(diào)用,準確地產(chǎn)生id與以前相同的結(jié)果(因為 new[1]被賦予了最近從產(chǎn)生的內(nèi)存中釋放的內(nèi)存list [::-1]),因為兩個lists 都使用地址 B

這實際上比需要的更復雜;id([1]) == id([1])最終也會得到相同的結(jié)果(它只會在空閑列表list上少留下一個 s list)。

當你以相反的方式做時,會發(fā)生這種情況:

  1. [1]分配在地址A

  2. id返回一個新的int描述地址A

  3. [1]被釋放并且地址A返回到池中

  4. 分配下一個[1],獲得 A,與第一個相同的內(nèi)存[1]

  5. [::-1]應用于它,list從新鮮記憶 B 中獲取新的;[1]然后被扔掉

  6. id[::-1]根據(jù)獲取描述地址 B的結(jié)果進行調(diào)用int;地址 A 和 B 的sid不匹配

如果您創(chuàng)建并存儲了這兩個lists,然后將id仍然存在的 slist相互比較,它們將是唯一的,因為這些內(nèi)存重用惡作劇將無法發(fā)生。


查看完整回答
反對 回復 2023-12-29
  • 1 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號