http://www.pythontutor.com/visualize.html 網(wǎng)站提供了 Python哀峻、C飒炎、C++ 因妙、Java荐操、Ruby 等不同語(yǔ)言的執(zhí)行可視化在線服務(wù)诅妹,對(duì)于理清或演示某些概念很有幫助罚勾。使用一個(gè)簡(jiǎn)單的示例來(lái)進(jìn)行說(shuō)明毅人。
python 的 list 是一個(gè)容器,對(duì) list 的賦值操作使得兩個(gè)變量都指向同一個(gè)對(duì)象尖殃。比如下面的代碼:
a = [1,2,3, ["Jan","Feb", "Mar"]]
b = a
a.append(4)
print (a)
print (b)
a 賦值給 b 后丈莺,對(duì) b 的改變后, print (b)
的結(jié)果是什么送丰?
在網(wǎng)站輸入以上代碼缔俄,點(diǎn)擊 Visualize Execution 按鈕,進(jìn)入下面的界面:
在左邊器躏,紅色箭頭指向下一步要執(zhí)行的代碼俐载,最下面顯示一共有 5 步,目前在第 1 步登失。點(diǎn)擊 Next 按鈕:
創(chuàng)建一個(gè) list 對(duì)象實(shí)例遏佣,同時(shí)在 global frame 中有一個(gè)變量 a 指向這個(gè) list。list offset 為 3 的元素是另外一個(gè) list揽浙,所以有另外一個(gè)參照的箭頭贼急。
點(diǎn)擊 Next 按鈕,執(zhí)行 b = a
:
現(xiàn)在 b 和 a 都指向 list 對(duì)象實(shí)例捏萍。
再點(diǎn)擊 Next 按鈕執(zhí)行 print 語(yǔ)句太抓,在 Output 區(qū)域輸出了 a 的結(jié)果。
點(diǎn)擊 Next 按鈕令杈,執(zhí)行 print (b)走敌,可以看到 b 的輸出和 a 一樣,因?yàn)樗鼈兌贾赶蛲粋€(gè)對(duì)象逗噩。
用可視化執(zhí)行理解 python 的淺拷貝和深拷貝
將上述代碼修改如下:
import copy
a = [1,2,3, ["Jan","Feb","Mar"]]
b = copy.copy(a)
a.append(4)
print (a)
print (b)
copy.copy()
方法執(zhí)行對(duì)象的淺拷貝:淺拷貝針對(duì)包含其他對(duì)象的對(duì)象來(lái)說(shuō)掉丽,對(duì)象本身拷貝,但對(duì)象包含的對(duì)象仍然是相同的引用(只拷貝最上層)异雁。以上代碼演示了淺拷貝捶障。在可視化執(zhí)行中顯示如下:
執(zhí)行了對(duì) a 的賦值后界面如下:
執(zhí)行了 淺拷貝的界面如下:
將代碼改為深拷貝。深拷貝的意思是對(duì)象本身和對(duì)象所包含的對(duì)象全部會(huì)被拷貝纲刀。
import copy
a = [1,2,3, ["Jan","Feb","Mar"]]
b = copy.deepcopy(a)
a.append(4)
print (a)
print (b)
可視化化執(zhí)行项炼,可以看到對(duì)象、子對(duì)象全部被創(chuàng)建: