賦值與深淺拷貝

2022-09-20 19:15:11 字數 1603 閱讀 1344

a = 1

b = a

a = 2

print('a==', a)

print('b==', b)

列印出結果:

a==2

b==1

解析:當a=1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b=a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x52446c40,這個時候a和b同時指向數字1,如下圖一:

圖一:

圖二:這個時候在列印出a和b就會發現它們是不一樣的。

a = [[1, 2], 3, 4]

b = a

a[1] = 'stone'

a[0][0] = '12345'

print('a==', a)

print('b==', b)

列印出結果:

a==[[12345, 2], 'stone', 4]

b==[[12345, 2], 'stone', 4]

發現只改變了a,但是b也同時改變了,a和b列印的結果是相同的。

圖三:而當a[1] = 'stone',a[1]存放的實體地址由原來的0x52446c80變成了0x16d8a4f0a0,而當a[0][0] = '12345'的時候,a[0][0]存放的實體地址由原來的0x52446c40變成了0x16d8af1a,標紅色的部分。這個時候a變化,b跟著變化,a和b是完全一樣的。如下圖四:

圖四:a = [[1, 2], 3, 4]

b = a.copy()

a[1] = 'stone'

a[0][0] = '12345'

print('a==', a)

print('b==', b)

列印出結果:

a==[[12345, 2], stone, 4]

b==[[12345, 2], 3, 4]

解釋:開始變得特別的奇怪了,怎麼a[1]改變了,b[1]沒有跟著改變,而a[0][0]改變了,而b[0][0]確又跟著改變了呢,這與場景二的有不同了,場景二是一變都變,這個是一部分跟著變,一部分又不變,我們還是來畫圖分析分析,見下圖五:

圖五:這裡大家發現和之前的場景二有什麼不一樣的地方的了,對了,就是a和b存放的實體地址不一樣,接著我們執行a[1] = 'stone',發現a[1]存放的實體地址從0x52446c80變成了0x238ea10f0a0,而b[1]沒有改變,接著再看,當執行a[0][0] = '12345'的時候,a[0][0]和b[0][0]都從原來的0x52446c40變成了0x238ea1da,初步總結一句,深淺拷貝,第一層改變各不相干,第一層往下的改變同時改變。見如下圖六:

圖六:

python賦值與深淺拷貝

參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...

Python賦值與深淺拷貝

a 1,2,3 b a a 4,5,6 賦新的值給 a a 4,5,6 b 1,2,3 a 的值改變後,b 並沒有隨著 a 變 a 1,2,3 b a a 0 a 1 a 2 4,5,6 改變原來 list 中的元素 a 4,5,6 b 4,5,6 a 的值改變後,b 隨著 a 變了 上面兩段 中,...

python中的深淺拷貝與賦值。

賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...