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

Python面向?qū)ο缶幊讨?lèi)的進(jìn)階

 更新時(shí)間:2021年11月01日 15:35:47   作者:一碗周  
這篇文章主要介紹了Python面向?qū)ο缶幊讨?lèi)的引用,引用 Reference是對(duì)象的指針,引用是內(nèi)存中真實(shí)對(duì)象的指針,表示為變量名或者內(nèi)存地址、每個(gè)對(duì)象存在至少一個(gè)引用,id()函數(shù)用于獲得引用,想具體了解的小伙伴可以參考下面文章的內(nèi)容

1、引用的概念

引用 (Reference)是對(duì)象的指針

引用是內(nèi)存中真實(shí)對(duì)象的指針,表示為變量名或者內(nèi)存地址
每個(gè)對(duì)象存在至少一個(gè)引用,id()函數(shù)用于獲得引用
在傳遞參數(shù)和賦值時(shí),Python傳遞對(duì)象的引用,而不是復(fù)制對(duì)象

示例代碼:

list1 = [1, 2, 3, 4]
list2 = list1
print(id(list1))  # 2044656837192
print(id(list2))  # 2044656837192
# 因?yàn)閘ist1是類(lèi)的實(shí)例化,list2引用的是list1,兩個(gè)都是引用的最基礎(chǔ)的object類(lèi),所以?xún)蓚€(gè)的結(jié)果是一樣的

Python內(nèi)部機(jī)制對(duì)引用的處理

  • 不可變對(duì)象:immutable解釋器為相同值維護(hù)盡量少的內(nèi)存區(qū)域
  • 可變對(duì)象:mutable解釋器為每個(gè)對(duì)象維護(hù)不同內(nèi)存區(qū)域

示例代碼:

text1 = "一碗周"
text2 = text1
text3 = "一碗周"
text4 = "一碗"
text5 = "周"
text6 = text4 + text5
print(id(text1))  # 1616972638288
print(id(text2))  # 1616972638288
print(id(text3))  # 1616972638288
print(id(text4))  # 1616973621272
print(id(text5))  # 1616973578032
print(id(text6))  # 1616974246288

因?yàn)?code>text1和2是引用的一個(gè)字符串,所以?xún)?nèi)存地址是一樣的;因?yàn)?code>Python解釋器會(huì)大可能的節(jié)省內(nèi)存空間,所以當(dāng)不可變類(lèi)型的值一樣時(shí),Python會(huì)將其自動(dòng)的引用一個(gè)地址空間,來(lái)達(dá)到節(jié)省空間的目的,所以text1/2/3的地址空間是一致的;Python解釋器并不會(huì)對(duì)計(jì)算出來(lái)的結(jié)果來(lái)進(jìn)行地址空間的優(yōu)化,就算兩個(gè)的值是一樣的,Python解釋器也會(huì)為新計(jì)算出來(lái)的結(jié)果來(lái)開(kāi)辟一個(gè)新的地址空間

示例代碼:

list1 = []
list2 = []
list3 = []
print(id(list1))  # 3204114440776
print(id(list2))  # 3204114440840
print(id(list3))  # 3204115873544

每個(gè)可變對(duì)象都有自己獨(dú)立的地址空間,并不復(fù)用地址空間

導(dǎo)致引用被+1的情況一般都4種

  • 對(duì)象被創(chuàng)建
  • 對(duì)象被引用
  • 對(duì)象被作為函數(shù)或方法的參數(shù)
  • 對(duì)象被作為一個(gè)容器中的元素

導(dǎo)致引用-1的情況一把也都4種

  • 對(duì)象被刪除
  • 對(duì)象的名字唄賦予新的對(duì)象
  • 對(duì)象離開(kāi)作用域
  • 對(duì)象所在容器被刪除

2、對(duì)象的拷貝

拷貝是復(fù)制一個(gè)對(duì)象為新對(duì)象,內(nèi)存空間有”變化“,拷貝分為淺拷貝和深拷貝

  • 淺拷貝:僅僅復(fù)制最頂層對(duì)象的拷貝方式,默認(rèn)拷貝方式
  • 深拷貝:迭代復(fù)制所有對(duì)象的拷貝方式

示例代碼(淺拷貝1)

list1 = ["甜甜", [1, 2, 3]]
list2 = list1.copy()  # 使用copy方法復(fù)制
list3 = list1[:]  # 使用切片復(fù)制
list4 = list(list1)  # 使用生成列表方式復(fù)制
for ch in [list1, list2, list3, list4]:
    for i in ch:
        print(i, id(i),  "\t", end="")  # 打印列表的沒(méi)一項(xiàng)和id
    print(ch, id(ch))  # 打印每個(gè)列表和id
    
'''
---輸出結(jié)果---
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905787490952
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817092488
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817137800
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817771656
'''

淺拷貝只是拷貝的列表這一層的內(nèi)存空間,里面的元素的內(nèi)存空間不會(huì)被拷貝

示例代碼(淺拷貝2)

list1 = ["一碗周", [1, 2, 3]]
list2 = list1.copy()  # 使用copy方法復(fù)制
list3 = list1[:]  # 使用切片復(fù)制
list4 = list(list1)  # 使用生成列表方式復(fù)制
list4[1].append(4)
print(list1)
print(list2)
print(list3)
print(list4)
'''
--輸出結(jié)果--
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
'''

這里只對(duì)list4進(jìn)行來(lái)數(shù)據(jù)的修改,但是所有的列表的內(nèi)容都發(fā)生了;這是因?yàn)槊總€(gè)列表所引用的內(nèi)容是一樣的,所以修改了1個(gè)四個(gè)會(huì)發(fā)生改變

深拷貝要采用copy庫(kù)里面的deepcopy()方法,迭代拷貝對(duì)象內(nèi)層的各層次對(duì)象,完全新開(kāi)辟內(nèi)存空間建立對(duì)象以及對(duì)象下層的各種對(duì)象元素,深拷貝僅僅針對(duì)可變類(lèi)別,不可變類(lèi)型不許創(chuàng)建新對(duì)象

示例代碼

import copy  # 導(dǎo)入庫(kù)
list1 = ["一碗周", [1, 2, 3]]
list2 = copy.deepcopy(list1)  # 使用copy庫(kù)的deepcopy方法復(fù)制
for ch in [list1, list2]:
    for i in ch:
        print(i, id(i),  "\t", end="")  # 打印列表的沒(méi)一項(xiàng)和id
    print(ch, id(ch))  # 打印每個(gè)列表和id

'''
---輸出結(jié)果---
一碗周 2190823984184   [1, 2, 3] 2190853845832   ['一碗周', [1, 2, 3]] 2190853766728
一碗周 2190823984184   [1, 2, 3] 2190853961544   ['一碗周', [1, 2, 3]] 2190853961480
'''

因?yàn)椤疤鹛稹弊址畬儆诓豢勺冾?lèi)型,所以其地址空間不會(huì)發(fā)生改變,剩下的地址空間都發(fā)生了改變

2.1 實(shí)例方法的引用

實(shí)例方法也是一種引用,就是對(duì)象本身的引用,當(dāng)方法被引用時(shí),方法(即函數(shù))將產(chǎn)生一個(gè)對(duì)象:方法對(duì)象

2.2 類(lèi)的特性裝飾器

@property裝飾器可以把方法改變成對(duì)外可見(jiàn)的”屬性“,在類(lèi)內(nèi)部表現(xiàn)為方法,在外邊表現(xiàn)為屬性

示例代碼

class TestClass:
    def __init__(self, name):
        self.name = name

    @property    # 將方法轉(zhuǎn)換為屬性
    def age(self):
        return self.__age

    @age.setter  # 為屬性進(jìn)行賦值操作
    def age(self, value):
        if value < 0 or value > 110:
            value = 19
        self.__age = value


tt = TestClass("一碗周")
bb = TestClass("一碗粥")
tt.age = 18
bb.age = -19
print(tt.age)  # 18
print(bb.age)  # 19

3、類(lèi)的名稱(chēng)修飾

名稱(chēng)修飾 (Name Mangling)是類(lèi)中名稱(chēng)的轉(zhuǎn)換約定,Python可以通過(guò)名稱(chēng)修飾來(lái)完成一些重要功能,在Python中采用下劃線(xiàn)_來(lái)進(jìn)行名稱(chēng)修飾,分為5種情況,

  • _name
  • name_
  • __name
  • __name__
  • _

3.1 _單下劃線(xiàn)開(kāi)頭的名稱(chēng)修飾

  • 單下劃線(xiàn)開(kāi)頭屬性或者方法為類(lèi)內(nèi)部使用的約定,是PEP8規(guī)定的一種約定
  • 只是約定,依然可以通過(guò)<對(duì)象名>.<屬性名>方式訪(fǎng)問(wèn)
  • 在功能的上的不同是使用from XX import *時(shí)不會(huì)導(dǎo)入單下劃線(xiàn)開(kāi)頭的屬性或者方法

示例代碼

class TestClass:
    def __init__(self, name):
        self._name = name  # 約定在內(nèi)部使用


tt = TestClass("一碗周")
print(tt._name)  # 一碗周

雖然約定在內(nèi)部使用,但是依然可以被訪(fǎng)問(wèn)

3.2 _單下劃線(xiàn)結(jié)尾的名稱(chēng)修飾

單下劃線(xiàn)結(jié)尾的屬性或者方法是避免與保留字或已有命名沖突,這也是PEP8規(guī)定的,這僅僅是一個(gè)約定,沒(méi)有任何對(duì)應(yīng)的功能

3.3 __雙下劃線(xiàn)開(kāi)頭的名稱(chēng)修飾

雙下劃線(xiàn)開(kāi)頭屬性或者方法將被解釋器修改名稱(chēng),避免命名沖突,這不是一個(gè)約定,而是功能性的, _nama會(huì)被修改為_(kāi)<類(lèi)名>__name的形式,來(lái)實(shí)現(xiàn)私有屬性、私有方法;這是一種類(lèi)的名稱(chēng)修飾,間接的來(lái)當(dāng)做私有屬性或者私有方法

3.4 __name__雙下劃線(xiàn)開(kāi)頭和結(jié)尾的名稱(chēng)修飾

雙下劃線(xiàn)開(kāi)頭和結(jié)尾的屬性或方法沒(méi)有任何特殊功能,名字不能被修改,部分名稱(chēng)是保留屬性或者保留方法

3.5 單下劃線(xiàn)

單下劃線(xiàn)僅僅是一個(gè)無(wú)關(guān)緊要的名字嗎,沒(méi)有特殊功能

4、Python的最小空類(lèi)

作用:

類(lèi)是一個(gè)命名空間,最小空類(lèi)可以當(dāng)做命名空間使用

  • 最小空類(lèi)可以輔助存儲(chǔ)和使用
  • 動(dòng)態(tài)增加屬性是Python類(lèi)的一個(gè)特點(diǎn)

示例代碼:

class TestClass:
    pass


a = TestClass
a.text = "一碗周"
print(a.text)  # 一碗周
# 可以動(dòng)態(tài)增加屬性來(lái)達(dá)到存儲(chǔ)信息的目的

到此這篇關(guān)于Python面向?qū)ο缶幊讨?lèi)的引用的文章就介紹到這了,更多相關(guān)Python類(lèi)的引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python Paramiko模塊的使用實(shí)際案例

    Python Paramiko模塊的使用實(shí)際案例

    這篇文章主要介紹了Python Paramiko模塊的使用實(shí)際案例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Python閉包函數(shù)定義與用法分析

    Python閉包函數(shù)定義與用法分析

    這篇文章主要介紹了Python閉包函數(shù)定義與用法,結(jié)合實(shí)例形式分析了Python閉包函數(shù)的功能、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • jupyter安裝失敗的解決,問(wèn)題出在rust環(huán)境和32位python

    jupyter安裝失敗的解決,問(wèn)題出在rust環(huán)境和32位python

    文章講述了如何解決在安裝Jupyter Notebook時(shí)遇到的問(wèn)題,包括安裝Rust和選擇合適的Python版本(64位)來(lái)避免兼容性問(wèn)題
    2025-02-02
  • opencv-python圖像處理安裝與基本操作方法

    opencv-python圖像處理安裝與基本操作方法

    OpenCV是一個(gè)C++庫(kù),目前流行的計(jì)算機(jī)視覺(jué)編程庫(kù),用于實(shí)時(shí)處理計(jì)算機(jī)視覺(jué)方面的問(wèn)題,它涵蓋了很多計(jì)算機(jī)視覺(jué)領(lǐng)域的模塊。在Python中常使用OpenCV庫(kù)實(shí)現(xiàn)圖像處理。本文介紹opencv-python圖像處理安裝與基本操作,感興趣的朋友一起看看吧
    2022-01-01
  • python獲取當(dāng)前文件和目錄路徑的方法詳解

    python獲取當(dāng)前文件和目錄路徑的方法詳解

    這篇文章主要介紹了Python中獲取當(dāng)前文件路徑和目錄的方法,包括使用__file__關(guān)鍵字、os.path.abspath、os.path.realpath以及sys.path,文中還介紹了在使用這些函數(shù)時(shí)需要注意的事項(xiàng),需要的朋友可以參考下
    2025-01-01
  • 詳解Python Matplot中文顯示完美解決方案

    詳解Python Matplot中文顯示完美解決方案

    這篇文章主要介紹了Python Matplot中文顯示完美解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 利用python中的matplotlib打印混淆矩陣實(shí)例

    利用python中的matplotlib打印混淆矩陣實(shí)例

    這篇文章主要介紹了利用python中的matplotlib打印混淆矩陣實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python中tkinter庫(kù)的簡(jiǎn)單使用

    Python中tkinter庫(kù)的簡(jiǎn)單使用

    這篇文章主要介紹了Python中tkinter庫(kù)的簡(jiǎn)單使用,Tkinter是Python中常用的GUI庫(kù),它使用Tk GUI工具包,并提供了創(chuàng)建各種GUI應(yīng)用程序的功能,需要的朋友可以參考下
    2023-10-10
  • Python項(xiàng)目打包成apk或者其他端的應(yīng)用程序

    Python項(xiàng)目打包成apk或者其他端的應(yīng)用程序

    本文主要介紹了使用Kivy和Buildozer將Python項(xiàng)目打包成Android APK文件的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Pytorch精準(zhǔn)記錄函數(shù)運(yùn)行時(shí)間的方法

    Pytorch精準(zhǔn)記錄函數(shù)運(yùn)行時(shí)間的方法

    參考Pytorch官方文檔對(duì)CUDA的描述,GPU的運(yùn)算是異步執(zhí)行的,一般來(lái)說(shuō),異步計(jì)算的效果對(duì)于調(diào)用者來(lái)說(shuō)是不可見(jiàn)的,異步計(jì)算的后果是,沒(méi)有同步的時(shí)間測(cè)量是不準(zhǔn)確的,所以本文給大家介紹了Pytorch如何精準(zhǔn)記錄函數(shù)運(yùn)行時(shí)間,需要的朋友可以參考下
    2024-11-11

最新評(píng)論

鞍山市| 章丘市| 山阳县| 鄂州市| 泰兴市| 新兴县| 昌图县| 玉山县| 莒南县| 芮城县| 文昌市| 连州市| 祁阳县| 桃江县| 米林县| 洛川县| 旺苍县| 天柱县| 西平县| 团风县| 宣汉县| 黄冈市| 舒城县| 朝阳市| 晋江市| 如东县| 尚志市| 泾源县| 蕉岭县| 新郑市| 乌鲁木齐市| 汝阳县| 竹北市| 泌阳县| 图木舒克市| 日土县| 余干县| 日喀则市| 汶上县| 封开县| 图木舒克市|