Python內(nèi)存處理_引用、淺、深拷貝

2018-08-22

  1. 對(duì)象的創(chuàng)建,依賴于申請(qǐng)的內(nèi)存空間中數(shù)據(jù)的加載,對(duì)象在內(nèi)存中的創(chuàng)建過程依賴于三部分內(nèi)存處理:對(duì)象分配內(nèi)存地址、引用變量和引用變量之間的關(guān)系
    參考代碼:
from memory_profiler import profile 
 
 
class Person: 
    ''' 自定義類型 ''' 
    def __init__(self, name, age, gender): 
        self.name = name 
        self.age = age 
        self.gender = gender 
 
@profile(precision=10) 
def main(): 
    ''' 入口函數(shù) ''' 
    p = Person("tom", 18, "男") 
    print(p) 
    p2 = Person("tom", 18, "男") 
    print(p) 
 
if __name__ == "__main__": 
    # 運(yùn)行代碼
 
    main() 
 

執(zhí)行內(nèi)存處理:

image.png

內(nèi)存分配圖解:


對(duì)于對(duì)象的創(chuàng)建,是將堆內(nèi)存中的對(duì)象的地址臨時(shí)存儲(chǔ)在棧內(nèi)存中變量中,那么在程
序中如果要在多個(gè)地方使用一個(gè)對(duì)象數(shù)據(jù)時(shí)應(yīng)該怎么辦呢?一般想到的都是將對(duì)象像文件
一樣復(fù)制一份不就好了。
Python中對(duì)于這樣的情況,有三種不同的操作方式:
  如果程序中多個(gè)不同的地方都要使用同一個(gè)對(duì)象,通過對(duì)象的引用賦值,將同一個(gè)對(duì)象賦值給多個(gè)變量
  如果程序多個(gè)不同的地方都要使用相同的數(shù)據(jù),通過對(duì)象的拷貝完成數(shù)據(jù)的簡(jiǎn)單復(fù)制即可,對(duì)象中的包含的數(shù)據(jù)必須統(tǒng)一
  如果程序中多個(gè)不同的地方使用相同的對(duì)象數(shù)據(jù),通過對(duì)象的深層次的復(fù)制,將對(duì)象的數(shù)據(jù)完整復(fù)制成獨(dú)立的另一份即可

對(duì)象的引用賦值:
  可以將對(duì)象的內(nèi)存地址同時(shí)賦值給多個(gè)變量,這個(gè)變量中存放的都是同一個(gè)對(duì)象的引用地址,如果通過一個(gè)變量修改了對(duì)象內(nèi)容,那么其他變量指向的對(duì)象內(nèi)容也會(huì)發(fā)生改變
  將一個(gè)變量中存放的對(duì)象的地址數(shù)據(jù),賦值給其他變量,通過賦操作符號(hào)就可以完成


image.png

對(duì)象的引用變量的賦值,并不是對(duì)象的賦值和備份,而僅僅是將對(duì)象的地址存儲(chǔ)在多個(gè)變量中方便程序操作


image.png

注意:PYTHON 中所謂對(duì)象的引用賦值,針對(duì)的是可變類型,不論是組合數(shù)據(jù)類型或者自定
義 class 類型,都具備引用賦值的操作;但是不適合不可變類型,不可變類型的引用賦值
操作有只讀不寫的特征,一旦通過變量重新賦值就會(huì)重新指向新的引用對(duì)象


image.png

對(duì)象的淺拷貝
  對(duì)于程序中對(duì)象的拷貝操作,除了前面介紹的引用賦值操作可以完成同一個(gè)對(duì)象在程序不
同位置的操作,這里的淺拷貝更是一種對(duì)象的臨時(shí)備份,淺拷貝的核心機(jī)制主要是賦值對(duì)象
內(nèi)部數(shù)據(jù)的引用
  PYTHON 內(nèi)建標(biāo)準(zhǔn)模塊 copy 提供了一個(gè) copy 函數(shù)可以完成:

image.png

對(duì)象的深拷貝:
  和對(duì)象的淺拷貝不同,對(duì)象的深拷貝,是對(duì)象數(shù)據(jù)的直接拷貝,而不是簡(jiǎn)單的引用拷貝
主要是通過 PYTHON 內(nèi)建標(biāo)準(zhǔn)模塊 copy 提供的 deepcopy 函數(shù)可以完成對(duì)象深拷貝 :


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,194評(píng)論 8 265
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,760評(píng)論 11 349
  • 風(fēng)像一個(gè)流氓,不斷騷擾著樹上的葉子;雨點(diǎn)很大,淅淅瀝瀝地澆濕了樓下的水泥地。我從陽臺(tái)望下,知道那里不會(huì)有你的身影。...
    笛梵斯閱讀 359評(píng)論 0 0
  • 時(shí)光飛逝,轉(zhuǎn)眼間奶奶離世已經(jīng)500多天了,但在我的印象中,奶奶好像從未離開過。當(dāng)我心情不好的時(shí)候,經(jīng)常會(huì)夢(mèng)見奶奶...
    拾憶girl閱讀 401評(píng)論 0 0

友情鏈接更多精彩內(nèi)容