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