看《Fluent Python》看到這一部分浑彰,感覺(jué)很有收獲砰嘁。分享一下。
引例
判斷一下下面Python程序語(yǔ)句的運(yùn)行結(jié)果:
t = (1, 2, [30, 40])
t[2] += [50, 60]
選項(xiàng):
a>. t 變?yōu)?(1, 2, [30, 40, 50, 60])
b>. TypeError: 'tuple' object does not support item assignment
c>. 沒(méi)有正確答案
d>. a, b 都是
你的選項(xiàng)是什么亩歹?
正確答案: d>
分析
一個(gè)很有用的網(wǎng)站:http://www.pythontutor.com 可以一步步地顯示程序的運(yùn)行過(guò)程:
一個(gè)有用的包:
s[a] += b
的過(guò)程分析:
- 將 s[a] 的值放到棧頂TOS
- 執(zhí)行
TOS += b
饼记, 如果TOS指向的是一個(gè)可變對(duì)象,則可以成功執(zhí)行 - 將TOS賦值給 s[a]:
s[a] = TOS
荧嵌, 如果s 是不可變的呛踊,操作會(huì)失敗。
所以啦撮,開(kāi)始的問(wèn)題就是這么個(gè)流程:
- 將 t[2] 即: [30, 40] 放到棧頂谭网,作為T(mén)OS
- 執(zhí)行
[30, 40] += [50, 60]
- 將TOS(此時(shí)即[30, 40, 50, 60])賦值回 t[2] 時(shí),因?yàn)?t 是 tuple , 是不可變的赃春,操作失敗愉择,拋出異常
收獲:
- 盡量不要在 tuple 中存放可變對(duì)象
-
+=
,*=
等操作不是原子操作 -
dis
模塊查看Python字節(jié)碼詳細(xì)執(zhí)行過(guò)程 - http://www.pythontutor.com 可以一步步地顯示程序的運(yùn)行過(guò)程