2018-08-22
- 對(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)存處理:

內(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)就可以完成

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

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

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

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