python變數、引用、拷貝之間的關係
阿新 • • 發佈:2019-01-04
變數和引用的關係
Python中一切皆為物件,不管是集合變數還是數值型or字串型的變數都是一個引用,都指向對應記憶體空間中的物件。- 不可變物件:int,float,long,str,tuple等;
In[20]: a = 1 In[21]: b = a In[22]: id(a) Out[22]: 33719592L In[23]: id(b) Out[23]: 33719592L In[24]: a = 2 In[25]: id(a) Out[25]: 33719568L In[26]: id(b) Out[26]: 33719592L In[27]: b = 3 In[28]: id(b) Out[28]: 33719544L
可以看出最開始a、b指向同一個記憶體空間,但是當改變a的值時,a指向了新的記憶體空間(此時b沒有發生變化),改變b時b也指向了新的記憶體空間;類似於c語言中的值傳遞。
2.可變物件:list,set,dict, array, matrix等
In[29]: list1 = [1,2,3] In[30]: list2 = list1 In[31]: id(list1) Out[31]: 61244552L In[32]: id(list2) Out[32]: 61244552L In[33]: list1[0] = 101 In[34]: id(list1) Out[34]: 61244552L In[35]: id(list2) Out[35]: 61244552L In[36]: list1 Out[36]: [101, 2, 3] In[37]: list2 Out[37]: [101, 2, 3] In[38]: list2[1] = 102 In[39]: id(list1) Out[39]: 61244552L In[40]: id(list2) Out[40]: 61244552L In[41]: list1 Out[41]: [101, 102, 3] In[42]: list2 Out[42]: [101, 102, 3]
剛開始list1和list2指向同一個記憶體空間,改變list1中的值時,list2也跟著改變,但是它們指向的記憶體空間沒有發生變化;同樣,改變list2中的值時,list1的值也跟著變化,它們仍
然指向同一個記憶體空間;
淺拷貝和深拷貝的區別
import copy a = [1,[1, 2, 3], [4, 5, 6]] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(15) a[1][2] = 10 a[0] = 0 print a print b print c print d print id(a) print id(b) print id(c) print id(d)
[0, [1, 2, 10], [4, 5, 6]]
[0, [1, 2, 10], [4, 5, 6]]
[1, [1, 2, 10], [4, 5, 6]]
[1, [1, 2, 3], [4, 5, 6]]
38023496
38023496
36700104
38023368
print 'a[1]',id(a[1])
print 'b[1]',id(b[1])
print 'c[1]',id(c[1])
print 'd[1]',id(d[1]),'\n'
print 'a[0]',id(a[0])
print 'b[0]',id(b[0])
print 'c[0]',id(c[0])
print 'd[0]',id(d[0])
a[1] 39654856
b[1] 39654856
c[1] 39654856
d[1] 39704904
a[0] 34112864
b[0] 34112864
c[0] 34112834
d[0] 34112840
b和a指向同一個記憶體空間,改變a中的值,則b跟著改變。c是a淺拷貝,c指向和a不同的記憶體空間,但是如果a中有一個元素為可變物件,則c中的此元素和a中的元素指向同一個記憶體空間,則改變a中此可變物件裡面的值時,c中的值也改變;改變a中不可變物件的元素的值時,c中的值不發生變化。d是a的深拷貝,d和a指向不同的記憶體空間,d內部的元素和a內部元素也指向不同的空間,改變a裡面的值時,d不會發生變化。