最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python中的弱引用與基礎(chǔ)類型支持情況

 更新時(shí)間:2023年07月24日 08:53:20   作者:及時(shí)  
最近有一個(gè)業(yè)務(wù)場(chǎng)景需要用Python自行實(shí)現(xiàn)一個(gè)簡(jiǎn)單的LRU cache,不可避免的接觸到了弱引用這一概念,所以下面就來和大家分享一下相關(guān)的知識(shí)吧

背景

最近有一個(gè)業(yè)務(wù)場(chǎng)景需要用Python自行實(shí)現(xiàn)一個(gè)簡(jiǎn)單的LRU cache,不可避免的接觸到了弱引用這一概念,這里記錄一下。

強(qiáng)引用

Python內(nèi)存回收由垃圾回收器自動(dòng)管理,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)歸0時(shí),其內(nèi)存就可能被回收掉,而引用計(jì)數(shù)器的數(shù)值其實(shí)就是代表有多少個(gè)強(qiáng)引用指向該對(duì)象,我們?nèi)粘懙腜ython代碼如果沒有使用到weakref模塊一般都只會(huì)涉及到強(qiáng)引用。
可以通過sys.getrefcount查看對(duì)象的引用計(jì)數(shù),如以下代碼:

import sys
alist = [1, 2, 3] # alist引用計(jì)數(shù)=1
print(sys.getrefcount(alist)) # 包括getrefcount本身新增的強(qiáng)引用,輸出2
blist = alist
print(sys.getrefcount(alist)) # 新增blist強(qiáng)引用,輸出3
print(blist) # 輸出[1, 2, 3]
del blist
print(sys.getrefcount(alist)) # 刪除了blist,強(qiáng)引用-1, 輸出2

弱引用

與強(qiáng)引用相對(duì),弱引用并不會(huì)影響對(duì)象的引用計(jì)數(shù),也就是說其不影響對(duì)象是否被回收的判定,如以下代碼:

import sys
import weakref
class tlist(list): # list本身不支持弱引用,但其子類支持
    pass
alist = tlist([1, 2, 3]) # alist引用計(jì)數(shù)=1
print(sys.getrefcount(alist)) # 輸出2
bref = weakref.ref(alist) # bref為對(duì)alist對(duì)象的弱引用
print(bref()) # 返回弱引用對(duì)象,輸出: [1, 2, 3]
print(sys.getrefcount(alist)) # 由于弱引用不影響引用計(jì)數(shù),依然輸出2
del alist # 刪除alist,對(duì)象引用計(jì)數(shù)變?yōu)?
print(bref()) # 由于bref指向的對(duì)象已無任何強(qiáng)引用,返回None

如上代碼所示弱引用不會(huì)影響對(duì)象的引用計(jì)數(shù),亦即不會(huì)影響對(duì)象內(nèi)存的回收,但是這里碰到一個(gè)引人疑惑的點(diǎn),就是Python中的基本數(shù)據(jù)類型對(duì)弱引用的支持分了三種情況。

基礎(chǔ)類型對(duì)于弱引用支持情況

基礎(chǔ)類型int、list、dict、tuple、str不支持弱引用,對(duì)其執(zhí)行弱引用會(huì)報(bào)錯(cuò):

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-9daeb515714d> in <module>
----> 1 weakref.ref(alist)
TypeError: cannot create weak reference to 'list' object

可以通過__weakrefoffset__查看類型是否支持弱引用,該變量表示弱引用指針相對(duì)對(duì)象起始地址的偏移量,>0表示支持弱引用:

In [1]: int.__weakrefoffset__
Out[1]: 0
In [2]: str.__weakrefoffset__
Out[2]: 0
In [3]: tuple.__weakrefoffset__
Out[3]: 0
In [4]: list.__weakrefoffset__
Out[4]: 0
In [5]: dict.__weakrefoffset__
Out[5]: 0
In [6]: set.__weakrefoffset__
Out[6]: 192

官方文檔中介紹:

Several built-in types such as list and dict do not directly support weak references but can add support through subclassing:
CPython implementation detail: Other built-in types such as tuple and int do not support weak references even when subclassed.

總結(jié)基礎(chǔ)類型對(duì)弱引用的支持分為以下三種情況(for python3.8):

  • 對(duì)于list、dict、str本身不支持弱引用,但可以通過創(chuàng)建子類的方式對(duì)其進(jìn)行弱引用
  • 對(duì)于int、tuple本身及其子類均不支持弱引用
  • set直接支持弱引用

這又是出于什么考慮?通過一番探究得出以下可能原因:

  • 絕大部分場(chǎng)景下,基礎(chǔ)類型使用并不涉及到弱引用,所以基礎(chǔ)類型不支持弱引用可以有效避免相應(yīng)的overhead。
  • 弱引用添加于Python2.1,所以對(duì)于之后添加的類型(包括object、type、set等)默認(rèn)都是支持弱引用的,除非有明確的理由不這么做。
  • 對(duì)于list、dict、int、str、tuple這些2.1之前的基礎(chǔ)類型為了兼容性考慮均默認(rèn)不支持弱引用,而set添加與2.3,因此其直接支持弱引用。
  • int、str、tuple這些不可變對(duì)象,在CPython解釋器中會(huì)有特殊的處理邏輯:
    4.1 如[-5, 256]范圍的小整數(shù)池一開始就被創(chuàng)建好了,在程序的整個(gè)生命周期無論是否被實(shí)際引用都不會(huì)被回收。
    4.2 又如對(duì)于同一個(gè)compilation unit的tuple對(duì)象,如果取值相同,編譯器會(huì)將獨(dú)立的多個(gè)相同的tuple對(duì)象處理為指向同一個(gè)對(duì)象的多個(gè)強(qiáng)引用。
    在這些情況下使用弱引用并沒有什么明顯的好處,反而額外引入了overhead,綜合考慮直接對(duì)其不支持弱引用。
  • 出于CPython的具體實(shí)現(xiàn)細(xì)節(jié),對(duì)于int、tuple的子類也不支持弱引用。

到此這篇關(guān)于淺析Python中的弱引用與基礎(chǔ)類型支持情況的文章就介紹到這了,更多相關(guān)Python弱引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas索引與賦值操作、排序以及Series排序和DataFrame排序方式

    pandas索引與賦值操作、排序以及Series排序和DataFrame排序方式

    這篇文章主要介紹了pandas索引與賦值操作、排序以及Series排序和DataFrame排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python配置文件處理的方法教程

    Python配置文件處理的方法教程

    這篇文章主要給大家介紹了關(guān)于Python配置文件處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用Python設(shè)置、更改及移除Word文檔密碼

    使用Python設(shè)置、更改及移除Word文檔密碼

    給Word文檔設(shè)置打開密碼是常見的Word文檔加密方式,如果我們需要對(duì)大量的Word文檔進(jìn)行加密、解密處理,Python是一個(gè)不錯(cuò)的選擇,本文將介紹如何使用Python設(shè)置、更改或移除Word文檔的加密,需要的朋友可以參考下
    2024-03-03
  • 詳解Python描述符的工作原理

    詳解Python描述符的工作原理

    在 Python 開發(fā)中,你可能聽說過「描述符」這個(gè)概念,由于我們很少直接使用它,所以大部分開發(fā)人員并不了解它的原理. 但作為熟練使用 Python,想要進(jìn)階的你,建議還是了解一下描述符的原理,這也便于你更深層次地理解 Python 的設(shè)計(jì)思想,需要的朋友可以參考下
    2021-06-06
  • pytorch GAN偽造手寫體mnist數(shù)據(jù)集方式

    pytorch GAN偽造手寫體mnist數(shù)據(jù)集方式

    今天小編就為大家分享一篇pytorch GAN偽造手寫體mnist數(shù)據(jù)集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Pytorch中的gather使用方法

    Pytorch中的gather使用方法

    這篇文章主要介紹了Pytorch中的gather使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python動(dòng)態(tài)網(wǎng)頁(yè)批量爬取

    python動(dòng)態(tài)網(wǎng)頁(yè)批量爬取

    這篇文章主要介紹了python動(dòng)態(tài)網(wǎng)頁(yè)批量爬取的方法,主要針對(duì)四六級(jí)成績(jī)批量爬取,感興趣的小伙伴們可以參考一下
    2016-02-02
  • HTML中使用python屏蔽一些基本功能的方法

    HTML中使用python屏蔽一些基本功能的方法

    這篇文章主要介紹了HTML中使用python屏蔽一些基本功能的方法,需要的朋友可以參考下
    2017-07-07
  • Matplotlib實(shí)戰(zhàn)之百分比柱狀圖繪制詳解

    Matplotlib實(shí)戰(zhàn)之百分比柱狀圖繪制詳解

    百分比堆疊式柱狀圖是一種特殊的柱狀圖,可以用于可視化比較不同類別或組的百分比或比例的圖表,下面我們就來介紹一下如何使用Matplotlib繪制百分比柱狀圖,需要的可以參考下
    2023-08-08
  • 簡(jiǎn)單談?wù)凱ython流程控制語(yǔ)句

    簡(jiǎn)單談?wù)凱ython流程控制語(yǔ)句

    流程控制是程序設(shè)計(jì)中一個(gè)重要的內(nèi)容,Python支持三種不同的控制結(jié)構(gòu):if,for和while,下面我們來簡(jiǎn)單談?wù)凱ython中的流程控制語(yǔ)句
    2016-12-12

最新評(píng)論

武清区| 霞浦县| 通城县| 水富县| 仲巴县| 新绛县| 平山县| 雷州市| 明光市| 丰都县| 礼泉县| 特克斯县| 葵青区| 天台县| 兖州市| 万年县| 海盐县| 常州市| 饶平县| 双牌县| 武冈市| 云梦县| 奈曼旗| 竹山县| 邵武市| 宽城| 临汾市| 镇平县| 阿荣旗| 灯塔市| 敖汉旗| 卓资县| 察隅县| 招远市| 博乐市| 九龙城区| 大理市| 都匀市| 同德县| 南岸区| 井陉县|