欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python中的陷阱有哪些

這篇文章主要介紹了Python中的陷阱有哪些的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Python中的陷阱有哪些文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司公司2013年成立,先為尖扎等服務(wù)建站,尖扎等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為尖扎企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

下面這個(gè)題,你是否能一眼看出問(wèn)題的本質(zhì)。

# 第一組
>>> a = 256
>>> b = 256
>>> a is b
True
# 第二組 >>> a = 257 >>> b = 257 >>> a is b False
# 第三組 >>> a = 257; b = 257 >>> a is b True

不管是 Python2 還是 Python3 環(huán)境下,只要你是在 CPython 的交互式命令行 REPL 中執(zhí)行,結(jié)果沒(méi)什么不同。

我們知道 is 比較的是兩個(gè)對(duì)象的內(nèi)存地址是否一樣( id 函數(shù)返回一個(gè)和對(duì)象的內(nèi)存地址相關(guān)的值),言外之意就是看a,b兩個(gè)變量是否指向同一個(gè)對(duì)象。我們來(lái)看看每個(gè)變量的 id 值。

>>> a = 256
>>> id(a)
1721788128
>>> b = 256
>>> id(a)
1721788128

>>> a = 257
>>> id(a)
14947024
>>> b = 257
>>> id(b)
14947104

>>> a = 257; b=257
>>> id(a)
14947136
>>> id(b)
14947136
>>>

不出所料,前后兩組 a,b的 id 值是相同的,只有中間這組 id 值不一樣,我們可以對(duì)其簡(jiǎn)單分析一下原因。在 Python 中,一切皆為對(duì)象,理論上任意兩個(gè)對(duì)象的 id 值都是不一樣的,例如:

>>> nums = [1,2,3,4]
>>> id(nums)
15148936

>>> nums2 = [1,2,3]
>>> id(nums2)
15160824

>>> nums3 = [1,2,3]
>>> id(nums3)
15160864

看得出每個(gè)對(duì)象的 id 值是不同的,哪怕兩個(gè)對(duì)象的值(內(nèi)容)相同,他們的 id 值也是不一樣的(nums2和nums3)。

那為什么前面第一組兩個(gè)對(duì)象的id值相同呢?可能有些同學(xué)已經(jīng)知道了

因?yàn)樵?Python 中,我們需要使用對(duì)象的時(shí)候 Python 就會(huì)為我們創(chuàng)建好,當(dāng)不需要了它就會(huì)進(jìn)行回收,就好比屋子里面的東西用完之后,要及時(shí)清理,否則整個(gè)屋子很快就會(huì)堆滿,最終導(dǎo)致房間再也塞不進(jìn)任何東西。

同樣的,為了提高性能,Python 就把一些常用的整數(shù)專門(mén)緩存起來(lái),就像屋子里面有些東西總是每天都要頻繁使用,比如床,你不能說(shuō)睡完之后,就把床搬出去,要用了再搬回來(lái),這樣的效率太低,因?yàn)檫@個(gè)搬運(yùn)過(guò)程實(shí)在是太耗時(shí)了。于是,我們可以專門(mén)拿一塊空間用來(lái)放置這個(gè)床。

Python 中也是同樣的道理,因?yàn)檎麛?shù)是我們經(jīng)常使用的對(duì)象,為了避免重復(fù)的創(chuàng)建、回收,干脆就把那些常用的整數(shù)緩存起來(lái),每次需要使用時(shí)直接從緩存中拿,而不是重新創(chuàng)建(重新創(chuàng)建的話,肯定是一個(gè)全新的對(duì)象)。這些整數(shù)的范圍是[-5, 256],當(dāng)然這個(gè)數(shù)字范圍是Python之父決定的,你要改,必須重新編譯Python環(huán)境。

現(xiàn)在我們就能解釋第一組為什么是True,第二組為什么是False了。

為什么第三組結(jié)果又是 True 了?,不是說(shuō)好大于256的整數(shù)不再緩存,每次使用都是新對(duì)象嗎?別急,再聽(tīng)我啰嗦一下。

還是出于性能考慮,Python內(nèi)部做了進(jìn)一步優(yōu)化,怎么優(yōu)化呢?但凡是在同一個(gè)代碼塊中的代碼,如果出現(xiàn)兩個(gè)值相同的整數(shù),那么它們將被重用,來(lái)看下面這個(gè)代碼:

# test.py
# -*- coding: utf-8 -*-
a = 257
b = 257

def func():
   c = 257
   print(a is c)  # False

print(a is b)  # True

func()

上面代碼是在一個(gè) test.py 文件中,運(yùn)行時(shí),a和b的id值相同,而c的id值與a不一樣,因?yàn)閍、b 在同一個(gè)代碼塊,屬于模塊級(jí)別,而 c 是在函數(shù)里面,屬于局部變量,他們不屬于同一代碼塊中,因此函數(shù)里面的 257 這個(gè)對(duì)象時(shí)會(huì)重新創(chuàng)建,而創(chuàng)建 b 的時(shí)候,發(fā)現(xiàn)同級(jí)代碼塊中有個(gè)257的值了,就重用了這個(gè)對(duì)象。

再回到前面講的第三組值,在 Python 的交互式命令行 REPL 中,每單獨(dú)一行都視為一個(gè)代碼塊,同一行中的代碼屬于同一個(gè)代碼塊,因此不難理解,第三組中的a和b處在同一個(gè)代碼塊中,所以后者重用了前者,因此,兩個(gè)變量的id是相同的。

有沒(méi)有覺(jué)得這是一個(gè)坑。雖然我們實(shí)際場(chǎng)景中并不一定能用上,但是至少我們知道了Python為我們做的一些優(yōu)化工作。

關(guān)于“Python中的陷阱有哪些”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Python中的陷阱有哪些”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:Python中的陷阱有哪些
網(wǎng)頁(yè)URL:http://chinadenli.net/article26/gepgjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作外貿(mào)建站ChatGPT網(wǎng)站排名品牌網(wǎng)站建設(shè)微信公眾號(hào)

廣告

聲明:本網(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)

微信小程序開(kāi)發(fā)