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

溫馨提示×

溫馨提示×

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

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

Python中如何引用計數

發布時間:2021-07-10 16:15:44 來源:億速云 閱讀:306 作者:Leah 欄目:編程語言

Python中如何引用計數,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

變量是內存引用

Python中的變量是內存引用。如果輸入x = [1,2]時會發生什么?[1,2]是對象。

回想一下,一切都是Python中的對象。[1,2]將在內存中創建。x是[1,2]對象的內存引用。

來看看下面的例子。可以找到x所引用的內存地址。請務必只使用id(x),它會以10為基數,而十六進制函數會將其轉換為十六進制。

x = [1, 2]    print(hex(id(x)))  # output: 0x32ebea8
Python中如何引用計數

引用計數

現在已經在內存中創建了一個list對象,而且x對該對象進行了引用。那么y=[1,2]和y=x有什么區別?

當輸入y=[1,2]時,它將在內存中創建一個新的list對象,并且y將引用它。

x = [1, 2]    y = [1, 2]    print(hex(id(x)))  # output: 0x101bea8    print(hex(id(y)))  # output: 0x31a5528

而當輸入y=x時,等同于告訴Python希望y 變量引用x變量引用的內容。因為變量是內存引用的。

可以確認x和y引用同一個對象。

x = [1, 2]    y = x    print(hex(id(x)))  # output: 0x74bea8    print(hex(id(y)))  # output: 0x74bea8
Python中如何引用計數

引用計數的數目

接下來的問題是,有多少變量引用同一個對象?

錯誤的用法:

我看到有些人在使用sys.getrefcount(var)時不知道如何傳遞var,而是向對象添加引用。一起看看下面的例子。

輸出3,而期望的卻是2(x andy)。發生這種情況是因為將x傳遞給getrefcount函數時又添加了一個引用。

from sys import getrefcount           x = [1, 2]           y = x           print(hex(id(x)))  # output: 0xb65748           print(hex(id(y)))  # output: 0xb65748           print(getrefcount(x))  # output: 3

更好的用法:

可以使用內置的ctypes模塊來找到預期的結果。必須將x的id傳遞給from_address函數。

from ctypes import c_long       x = [1, 2]       y = x       print(hex(id(x)))  # output: 0x3395748       print(hex(id(y)))  # output: 0x3395748       print(c_long.from_address(id(x)).value)  # output: 2

概言之,錯誤的用法是傳遞變量,而更好的用法則是傳遞變量的id,這意味著只傳遞基數為10的數字,而不是變量。

當對象消失時

當沒有變量引用對象時會發生什么?

對象將從內存中刪除,因為沒有引用該對象的內容。不過也有例外:如果有循環引用,garbage collector 將開始奏效。

為什么使用可變對象

不可變對象由于性能原因,結果可能與預期不同。查看下面的例子,觀察輸出是如何變化的。

import sys       import ctypes              """Some Mutable Objects """       a =list()       b =set()       c =dict()       d =bytearray()       """ Some ImmutableObjects """       e =tuple()       f =int()       g =str()       print(sys.getrefcount(a),ctypes.c_long.from_address(id(a)).value)  # output: 2 1       print(sys.getrefcount(b),ctypes.c_long.from_address(id(b)).value)  # output: 2 1       print(sys.getrefcount(c),ctypes.c_long.from_address(id(c)).value)  # output: 2 1       print(sys.getrefcount(d),ctypes.c_long.from_address(id(d)).value)  # output: 2 1       print(sys.getrefcount(e),ctypes.c_long.from_address(id(e)).value)  # output: 1298 1297       print(sys.getrefcount(f),ctypes.c_long.from_address(id(f)).value)  # output: 209 208       print(sys.getrefcount(g),ctypes.c_long.from_address(id(g)).value)  # output: 59 58

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

玉门市| 鄂托克旗| 广昌县| 开原市| 突泉县| 高要市| 海南省| 兰考县| 常山县| 抚松县| 武清区| 湖南省| 辽中县| 西宁市| 临沭县| 宜川县| 宁安市| 南丹县| 娱乐| 石狮市| 西峡县| 榆中县| 白朗县| 鞍山市| 平定县| 讷河市| 巴彦县| 达尔| 重庆市| 鲁山县| 凤阳县| 长治市| 万源市| 禹城市| 和平区| 息烽县| 郯城县| 洛川县| 五大连池市| 双峰县| 城市|