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,...