眾所周知,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...