正文
本文有些零碎,總題來說,包括兩個(gè)問題:(1)可變對象(最常見的是list dict)被意外修改的問題,(2)對參數(shù)(parameter)的檢查問題。這兩個(gè)問題,本質(zhì)都是因?yàn)閯?dòng)態(tài)語言(動(dòng)態(tài)類型語言)的特性造成了,動(dòng)態(tài)語言的好處就不細(xì)說了,本文是要討論因?yàn)閯?dòng)態(tài)--這種靈活性帶來的一些問題。
什么是動(dòng)態(tài)語言(Dynamic Programming language)呢,是相對于靜態(tài)語言而言,將很多靜態(tài)語言編譯(compilation)時(shí)期所做的事情推遲到運(yùn)行時(shí),在運(yùn)行時(shí)修改代碼的行為,比如添加新的對象和函數(shù),修改既有代碼的功能,改變類型。絕大多數(shù)動(dòng)態(tài)語言都是動(dòng)態(tài)類型(Dynamic Typed),所謂動(dòng)態(tài)類型,是在運(yùn)行時(shí)確定數(shù)據(jù)類型,變量使用之前不需要類型聲明,通常變量的類型是被賦值的那個(gè)值的類型。Python就是屬于典型的動(dòng)態(tài)語言。
動(dòng)態(tài)語言的魅力在于讓開發(fā)人員更好的關(guān)注需要解決的問題本身,而不是冗雜的語言規(guī)范,也不用干啥都得寫個(gè)類。運(yùn)行時(shí)改變代碼的行為也是非常有用,比如python的熱更新,可以做到不關(guān)服務(wù)器就替換代碼的邏輯,而靜態(tài)語言如C++就很難做到這一點(diǎn)。筆者使用得最多的就是C++和Python,C++中的一些復(fù)雜的點(diǎn),比如模板(泛型編程)、設(shè)計(jì)模式(比如template method),在Python中使用起來非常自然。我也看到過有一些文章指出,設(shè)計(jì)模式往往是特定靜態(tài)語言的補(bǔ)丁 -- 為了彌補(bǔ)語言的缺陷或者限制。
以筆者的知識水平,遠(yuǎn)遠(yuǎn)不足以評價(jià)動(dòng)態(tài)語言與靜態(tài)語言的優(yōu)劣。本文也只是記錄在我使用Python這門動(dòng)態(tài)語言的時(shí)候,由于語言的靈活性,由于動(dòng)態(tài)類型,踩過的坑,一點(diǎn)思考,以及困惑。
本文地址:http://www.cnblogs.com/xybaby/p/7208496.html
第一個(gè)問題:Mutable對象被誤改
這個(gè)是在線上環(huán)境出現(xiàn)過的一個(gè)BUG
事后說起來很簡單,服務(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)
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26