正文

  本文有些零碎,總題來(lái)說(shuō),包括兩個(gè)問(wèn)題:(1)可變對(duì)象(最常見(jiàn)的是list dict)被意外修改的問(wèn)題,(2)對(duì)參數(shù)(parameter)的檢查問(wèn)題。這兩個(gè)問(wèn)題,本質(zhì)都是因?yàn)閯?dòng)態(tài)語(yǔ)言(動(dòng)態(tài)類(lèi)型語(yǔ)言)的特性造成了,動(dòng)態(tài)語(yǔ)言的好處就不細(xì)說(shuō)了,本文是要討論因?yàn)閯?dòng)態(tài)--這種靈活性帶來(lái)的一些問(wèn)題。

  什么是動(dòng)態(tài)語(yǔ)言(Dynamic Programming language)呢,是相對(duì)于靜態(tài)語(yǔ)言而言,將很多靜態(tài)語(yǔ)言編譯(compilation)時(shí)期所做的事情推遲到運(yùn)行時(shí),在運(yùn)行時(shí)修改代碼的行為,比如添加新的對(duì)象和函數(shù),修改既有代碼的功能,改變類(lèi)型。絕大多數(shù)動(dòng)態(tài)語(yǔ)言都是動(dòng)態(tài)類(lèi)型(Dynamic Typed),所謂動(dòng)態(tài)類(lèi)型,是在運(yùn)行時(shí)確定數(shù)據(jù)類(lèi)型,變量使用之前不需要類(lèi)型聲明,通常變量的類(lèi)型是被賦值的那個(gè)值的類(lèi)型。Python就是屬于典型的動(dòng)態(tài)語(yǔ)言。

  動(dòng)態(tài)語(yǔ)言的魅力在于讓開(kāi)發(fā)人員更好的關(guān)注需要解決的問(wèn)題本身,而不是冗雜的語(yǔ)言規(guī)范,也不用干啥都得寫(xiě)個(gè)類(lèi)。運(yùn)行時(shí)改變代碼的行為也是非常有用,比如python的熱更新,可以做到不關(guān)服務(wù)器就替換代碼的邏輯,而靜態(tài)語(yǔ)言如C++就很難做到這一點(diǎn)。筆者使用得最多的就是C++和Python,C++中的一些復(fù)雜的點(diǎn),比如模板(泛型編程)、設(shè)計(jì)模式(比如template method),在Python中使用起來(lái)非常自然。我也看到過(guò)有一些文章指出,設(shè)計(jì)模式往往是特定靜態(tài)語(yǔ)言的補(bǔ)丁 -- 為了彌補(bǔ)語(yǔ)言的缺陷或者限制。

  以筆者的知識(shí)水平,遠(yuǎn)遠(yuǎn)不足以評(píng)價(jià)動(dòng)態(tài)語(yǔ)言與靜態(tài)語(yǔ)言的優(yōu)劣。本文也只是記錄在我使用Python這門(mén)動(dòng)態(tài)語(yǔ)言的時(shí)候,由于語(yǔ)言的靈活性,由于動(dòng)態(tài)類(lèi)型,踩過(guò)的坑,一點(diǎn)思考,以及困惑。

  本文地址:http://www.cnblogs.com/xybaby/p/7208496.html

第一個(gè)問(wèn)題:Mutable對(duì)象被誤改

回到頂部

  這個(gè)是在線上環(huán)境出現(xiàn)過(guò)的一個(gè)BUG

  事后說(shuō)起來(lái)很簡(jiǎn)單,服務(wù)端數(shù)據(jù)(放在dict里面的)被意外修改了,但查證的時(shí)候也花了許多時(shí)間,偽代碼如下:

1 def routine(dct):2     if high_propability:3         sub_routine_no_change_dct(dct)4     else:5         sub_routine_will_change_dct(dct)

網(wǎng)友評(píng)論