Python之變數與物件
阿新 • • 發佈:2018-11-12
變數與物件
- 物件 :記憶體中儲存資料的實體,Python中一切皆是物件,函式也是物件;
- 變數 :對物件的引用,指向物件的指標,變數與物件是分開的;
可變物件與不可變物件
- 不可變物件 :該物件對應記憶體中的值不會變,因此如果指向該物件的變數被改變了,會重新開闢一片地址,變數再指向這個新的地址;如:int,float,str,tuple;
- 可變物件 :該物件對應記憶體中的值可以被改變,因此變數改變後,該物件也被改變,即原地改變。如:list,dict,set;
對於不可變物件,所有指向該物件的變數在記憶體中共用一個地址:
>> > a = 1
>>> b = 1
>>> c = a + 0
>>> print(id(a)==id(b) and id(a)==id(c))
True
不可變物件改變一個值,原始變數不變:
>>> a = 1
>>> b = a
>>> b = 2
>>> a
1
可變物件改變一個值,原始變數也被改變:
>>> a = [1]
>>> b = a
>>> b.append(2)
>> > a
[1, 2]
注:當物件的引用計數為0時,該物件對應的記憶體會被回收。
深拷貝與淺拷貝
不可變物件無論深淺拷貝其地址都一樣;
可變物件以list舉例,分三種情況:
- 1直接賦值:僅僅拷貝了引用,因此原list改變,拷貝的也改變;
- 2淺拷貝:拷貝了最外圍物件本身,內部元素拷貝其引用,使用copy;
- 3深拷貝:外圍內圍都拷貝物件本身,非引用,前後完全隔離,使用deepcopy;
舉例說明:
>>> import copy
>>> a = [1,2,[1,2]]
>>> b = a #直接賦值
>>> c = copy.copy(a) #淺拷貝
>>> d = a[:] #相當於淺拷貝
>>> e = copy.deepcopy(a) #深拷貝
>>> a.append(3)
>>> a
[1, 2, [1, 2], 3]
>>> b #直接賦值的跟隨改變
[1, 2, [1, 2], 3]
>>> c #淺拷貝外圍為拷貝,因此不變
[1, 2, [1, 2]]
>>> d #同c
[1, 2, [1, 2]]
>>> e #深拷貝內外都不變
[1, 2, [1, 2]]
>>> a[2].append(3)
>>> a
[1, 2, [1, 2, 3], 3]
>>> b #直接賦值的跟隨改變
[1, 2, [1, 2, 3], 3]
>>> c #淺拷貝內部拷貝的是應用,跟隨改變
[1, 2, [1, 2, 3]]
>>> d #同c
[1, 2, [1, 2, 3]]
>>> e #深拷貝內外都不變
[1, 2, [1, 2]]