91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的陷阱有哪些

發布時間:2022-01-17 15:06:35 來源:億速云 閱讀:150 作者:iii 欄目:大數據

這篇文章主要介紹了Python中的陷阱有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python中的陷阱有哪些文章都會有所收獲,下面我們一起來看看吧。

下面這個題,你是否能一眼看出問題的本質。

# 第一組
>>> 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 環境下,只要你是在 CPython 的交互式命令行 REPL 中執行,結果沒什么不同。

我們知道 is 比較的是兩個對象的內存地址是否一樣( id 函數返回一個和對象的內存地址相關的值),言外之意就是看a,b兩個變量是否指向同一個對象。我們來看看每個變量的 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 值不一樣,我們可以對其簡單分析一下原因。在 Python 中,一切皆為對象,理論上任意兩個對象的 id 值都是不一樣的,例如:

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

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

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

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

那為什么前面第一組兩個對象的id值相同呢?可能有些同學已經知道了

因為在 Python 中,我們需要使用對象的時候 Python 就會為我們創建好,當不需要了它就會進行回收,就好比屋子里面的東西用完之后,要及時清理,否則整個屋子很快就會堆滿,最終導致房間再也塞不進任何東西。

同樣的,為了提高性能,Python 就把一些常用的整數專門緩存起來,就像屋子里面有些東西總是每天都要頻繁使用,比如床,你不能說睡完之后,就把床搬出去,要用了再搬回來,這樣的效率太低,因為這個搬運過程實在是太耗時了。于是,我們可以專門拿一塊空間用來放置這個床。

Python 中也是同樣的道理,因為整數是我們經常使用的對象,為了避免重復的創建、回收,干脆就把那些常用的整數緩存起來,每次需要使用時直接從緩存中拿,而不是重新創建(重新創建的話,肯定是一個全新的對象)。這些整數的范圍是[-5, 256],當然這個數字范圍是Python之父決定的,你要改,必須重新編譯Python環境。

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

為什么第三組結果又是 True 了?,不是說好大于256的整數不再緩存,每次使用都是新對象嗎?別急,再聽我啰嗦一下。

還是出于性能考慮,Python內部做了進一步優化,怎么優化呢?但凡是在同一個代碼塊中的代碼,如果出現兩個值相同的整數,那么它們將被重用,來看下面這個代碼:

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

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

print(a is b)  # True

func()

上面代碼是在一個 test.py 文件中,運行時,a和b的id值相同,而c的id值與a不一樣,因為a、b 在同一個代碼塊,屬于模塊級別,而 c 是在函數里面,屬于局部變量,他們不屬于同一代碼塊中,因此函數里面的 257 這個對象時會重新創建,而創建 b 的時候,發現同級代碼塊中有個257的值了,就重用了這個對象。

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

有沒有覺得這是一個坑。雖然我們實際場景中并不一定能用上,但是至少我們知道了Python為我們做的一些優化工作。

關于“Python中的陷阱有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python中的陷阱有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巍山| 赣榆县| 九龙坡区| 精河县| 桃园县| 马尔康县| 泰州市| 峨山| 临高县| 千阳县| 漠河县| 华容县| 巍山| 平山县| 东阿县| 红河县| 白沙| 临猗县| 龙南县| 五华县| 蕉岭县| 兴文县| 共和县| 镇安县| 新平| 灵山县| 武穴市| 芦溪县| 本溪市| 张家口市| 晋中市| 香格里拉县| 繁昌县| 运城市| 贡嘎县| 莆田市| 伊宁市| 图们市| 航空| 牡丹江市| 纳雍县|