js中有像python內(nèi)一樣的id函數(shù).

創(chuàng)新互聯(lián)建站主營肇州網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶App定制開發(fā),肇州h5成都微信小程序搭建,肇州網(wǎng)站營銷推廣歡迎肇州等地區(qū)企業(yè)咨詢
真實情況是當執(zhí)行.操作符的時候,實際是生成了一個proxy對象,foo.bar is Foo.bar的時候,兩個對象順序生成,放在棧里相比較,由于地址不同肯定是False,但是id(foo.bar) == id(Foo.bar)的時候就不同了,首先生成foo.bar,然后計算foo.bar的地址,計算完之后foo.bar的地址之后,就沒有任何對象指向foo.bar了,所以foo.bar對象就會被釋放。然后生成Foo.bar對象,由于foo.bar和Foo.bar所占用的內(nèi)存大小是一樣的,所以又恰好重用了原先foo.bar的內(nèi)存地址,所以id(foo.bar) == id(Foo.bar)的結果是True。
下面內(nèi)容由郵件Leo Jay大牛提供,他解釋的更加通透。
用id(expression a) == id(expression b)來判斷兩個表達式的結果是不是同一個對象的想法是有問題的。
foo.bar 這種形式叫 attribute reference [1],它是表達式的一種。foo是一個instance object,bar是一個方法,這個時候表達式foo.bar返回的結果叫method object [2]。
在工作中遇到一個項目的陳年老bug,如圖:
bug原因是這里本應該傳idx,結果傳成了id。
但是這里最有意思的地方來了。
從截圖可以看出,這個id并不是入?yún)ⅲ矝]有定義過,那他直接用怎么不會報參數(shù)未定義的語法錯誤呢?按說函數(shù)應該執(zhí)行不了直接報錯,但是實際上整個方法可以執(zhí)行不會報錯。
排查import也沒有import id,也沒有定義全局變量。那么這個id變量沒有在任何地方定義,為什么可以直接使用呢,還不會報語法錯誤?
經(jīng)過查閱資料才發(fā)現(xiàn),id在這里其實 不是一個變量,而是一個函數(shù)!
查看官方文檔可以看到:
所以id()本身是python內(nèi)置的一個函數(shù),但是因為很少用到,所以很多人并不太清楚。
id方法的返回值就是對象的內(nèi)存地址。
python中會為每個出現(xiàn)的對象分配內(nèi)存,哪怕他們的值完全相等(注意是相等不是相同)。如執(zhí)行a=2.0,b=2.0這兩個語句時會先后為2.0這個Float類型對象分配內(nèi)存,然后將a與b分別指向這兩個對象。所以a與b指向的不是同一對象:
a=2.0
b=2.0
a is b
False
a==b
True
但是為了提高內(nèi)存利用效率對于一些簡單的對象,如一些數(shù)值較小的int對象,python采取重用對象內(nèi)存的辦法,如指向a=2,b=2時,由于2作為簡單的int類型且數(shù)值小,python不會兩次為其分配內(nèi)存,而是只分配一次,然后將a與b同時指向已分配的對象:
a=2
b=2
a is b
True
如果賦值的不是2而是大的數(shù)值,情況就跟前面的一樣了:
a=5555
b=5555
a is b
False
id(a)
12464372
id(b)
12464396
用id()函數(shù)當a,b為2的時候id相同,而為2.5的時候不同,這種情況在string字符串的時候也會出現(xiàn),即當很短的a,b賦值很短的字符串的時候,它們的id值相同,而很長的則不會。
id()函數(shù)用于獲取對象的內(nèi)存地址。語法id([object]),返回對象的內(nèi)存地址。對于字符串、整數(shù)等類型,變量的id是隨值的改變而改變的。
id(object)返回的是對象的“身份證號”,唯一且不變,但在不重合的生命周期里,可能會出現(xiàn)相同的id值。
用于獲取對象的內(nèi)存地址。
我們每一個人都有身份證來證明自己的身份。網(wǎng)絡地址也有,那就是id。
網(wǎng)絡id可以用來表示計算機屬于哪個網(wǎng)絡。Python中也有id函數(shù),而Python中每個對象擁有唯一的內(nèi)存id,所以id函數(shù)它主要用于獲取指定對象的內(nèi)存id值,是Python中必不可少的內(nèi)置函數(shù)。Python中id()函數(shù)用于獲取對象的內(nèi)存地址。
id(object)返回的是對象的“身份證號”,唯一且不變,但在不重合的生命周期里,可能會出現(xiàn)相同的id值。此處所說的對象應該特指復合類型的對象(如類、list等),對于字符串、整數(shù)等類型,變量的id是隨值的改變而改變的。
本文標題:python沒用id函數(shù) python id 函數(shù)
文章分享:http://chinadenli.net/article34/hepdpe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、微信公眾號、微信小程序、網(wǎng)站設計公司、定制開發(fā)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)