python中有關賦值的問題

2021-06-29 16:43:33 字數 1593 閱讀 8329

眾所周知,python的賦值和一般的高階語言的賦值有很大的不同,它是引用賦值。看下面的**1:

>>>a = 5

>>>b = 8

>>>  a = b    #結果如下圖1:

圖1開始的時候a指向的是5,b指向的是8,當a = b的時候,b把自己指向的位址(也就是8的記憶體位址)賦給了a,那麼最後的結果就是a和b同時指向了8。我們可以用python內建的函式id()來測試

那好,現在我們來看下一種情況: 

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

>>>id(a )               #可以得到1217620

>>>id(a)                #結果還是1217620,證明如果是新增物件,不改變變數的記憶體位址,這個是我們下面要**的問題的先決條件。

>>>b = a               # b = [1,2,3,4]

如果沒有上面的結論,[1,2,3,4]的位址和[1,2,3]的位址不一樣,那麼最終的結果是 a = [1,2,3,4,5], b = [1,2,3,4]

那怎麼才能夠讓a變成[1,2,3,4],而b仍然是[1,2,3]呢? 這個時候我們需要用到copy,也就是拷貝,python內建了copy模組。看**2

>>>import copy

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

>>>b = copy.copy(a)   #這個時候a = b = [1,2,3]

事情到這裡好像就結束了,但是問題又來啦,看下面的**3

>>>import copy

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

>>>b = copy.copy(a)

>>>id(a)                    #12177080

>>>id(b)                    #12186888,證明a、b指向的不是同乙個位址

>>>id(a[0])                # 100380032

>>>id(b[0])                # 100380032 二者是共享位址的

也就是說這個copy.copy複製的不徹底,只複製了物件,物件的屬性卻是共享的。那我們有別的方法沒?答案是肯定的,看下面的**4

>>>import copy

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

>>>b = copy.deepcopy(a)

>>>id(a)                      #12177080

>>>id(b)                      #12177000

>>>id(a[2][1])             #10379996

>>>id(b[2][1])             #10379996     這兩個還是一樣的,大惑不解,這是為什麼?求達人解惑 

經過linvo同學的指點,現在明白了為什麼是這樣。下面畫個圖:

如果只是淺拷貝(copy.copy),那麼虛線部分是不會賦值給b的,只是把 [3,4]這個列表整體賦值。所以結果如**3所示

而如果是深拷貝(copy.deepcopy),那麼會把列表[3,4]的具體成員也賦給b,這也解釋了**4的疑惑

未完待續。。。。。。。。。。。。。。。。。

c 中有關size type的問題

sizt t是 c 的乙個標準的 typedef.全域性有效,定義在全域性命名空間中 size type是 stl定義的,只在 namespace std 中有效vc6中定義 size t 為typedef unsigned int size t size type應該是 c 為例如 string ...

python中有關矩陣的操作

from numpy import 匯入numpy的庫函式 import numpy as np a array 1,2,3,11,12,13,21,22,23 4,5,6,14,15,16,24,25,26 7,8,9,17,18,19,27,28,29 print a print a 1 3 讀...

Python中有關時間的模組

time 模組 datetime 模組 對date time datetime 三種時間模式進行單獨管理 datetime.date 處理日期 年 月 日 datatime.time 處理時間 時分秒,毫秒 datetime.datetime 處理日期 和 時間 datetime.timedelta...