python變數 引用 拷貝之間的關係

2021-07-24 22:02:34 字數 2619 閱讀 2244

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[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不會發生變化

python變數的引用,淺拷貝

python的變數是物件引用 l1和l2引用的相同的物件,所以會相互影響 元組不變的是引用的實體地址,如果引用的物件是可變的,那麼遠祖也會發生變化 但是t1 2 的id時鐘沒有發生變化 2 預設是淺拷貝,如果不可變,那麼互相不影響,沒問題 如果變數是可變的物件,就會比較麻煩 最終發現l1和l2始終引...

python 引用,淺拷貝,深拷貝

引用 當物件是不可變型別的時候,int float double string tuple 純tuple 遇到 引用 問題時,雖然起初兩個變數指向同乙個記憶體位址,但是改變了其中乙個值,並不會影響另外乙個 會重新開闢記憶體位址 當物件是可變型別的時候,list dic,遇到 引用 問題,會一直共享一...

Python深拷貝 淺拷貝 引用

列表巢狀 如果想拷貝之後賦值的變數不想影響之前的列 表變數import copy 反之copy usr bin env python coding utf 8 author mxl time 2020 3 17 import copy a 1,2,3 b a a print a的初始值為 str a...