資料型別、記憶體與拷貝

morra發表於2016-10-13

一、資料型別與記憶體

靜態儲存

python是用c寫的,python裡的str也是用c寫的,但是c語言裡預設是沒有字串的,它使用的是字元陣列,這種陣列只要存在記憶體就固定佔用一定記憶體,它是不可修改的。
而使用replace()更改字串,實際上是又生成了另一個新字串用作修改,初始的字串是不變的,它依然存放於記憶體裡。

資料型別、記憶體與拷貝

動態儲存

list、dict等是動態的,可以記錄下一個元素的位置或上一個元素的位置,下面以list為例:
資料型別、記憶體與拷貝

二、深拷貝與淺拷貝

int、str

對數字和字元而言,賦值、淺拷貝與深拷貝都無意義,因為永遠指向同一個記憶體地址:

import copy    #在使用拷貝時需要匯入copy模組

n1 = 123
print(id(n1))       #4297550464

n2 = n1             #賦值
print(id(n2))       #4297550464

n3 = copy.copy(n1)  #淺拷貝
print(id(n3))       #4297550464

n4 = copy.deepcopy(n1)    #深拷貝
print(id(n4))       #4297550464

list、dict、tuple

對於list、dict、tuple而言,意義就大不一樣了
* 賦值

n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]}
n2 = n1

資料型別、記憶體與拷貝

* 淺拷貝
在記憶體中只額外建立第一層資料

import copy

n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]}
n2 = copy.copy(n1)

資料型別、記憶體與拷貝

* 深拷貝
在記憶體中將所有的資料建立一份(最後一層資料除外,這是由python內部對字串和數字型別的優化導致的)

import copy​

n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]}
n2 = copy.deepcopy(n1)

資料型別、記憶體與拷貝

相關文章