1. 程式人生 > >Python之變數與物件

Python之變數與物件

變數與物件

  • 物件 :記憶體中儲存資料的實體,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]]