初學Python,貽笑大方。spa
今天遇到一坑,涉及到字典(dict)
做爲參數傳入方法內時的操做,和更新字典內容兩方面內容。code
首先第一點:blog
咱們來對比一下一組代碼:作用域
代碼A:get
# 添加默認字段 def setInsertModel(opt_user_id, dic): # 默認字段元組 common_dic = { 'del_flg': consts.CommonFlg.COM_FLG_OFF.value, 'creator_id': opt_user_id, 'create_dt': DateUtils.getNow(), 'updater_id': opt_user_id, 'update_dt': DateUtils.getNow(), } # 添加默認字段 dic.update(common_dic)
代碼B:class
# 添加默認字段 def setInsertModel(opt_user_id, **dic): # 默認字段元組 common_dic = { 'del_flg': consts.CommonFlg.COM_FLG_OFF.value, 'creator_id': opt_user_id, 'create_dt': DateUtils.getNow(), 'updater_id': opt_user_id, 'update_dt': DateUtils.getNow(), } # 添加默認字段 dic.update(common_dic)
僅僅是方法參數定義時加了雙星號(**,表明收集到的參數在方法中做爲元組使用),可是結果不一樣。date
中間的代碼就不貼出來了,省的丟人。下面是model更新後的結果:model
第二條數據是代碼B執行後的結果,而第一條與第三條數據則是代碼A執行後的結果。這說明做爲參數的dic,在代碼A中並無被修改。引用
如今做爲初學者簡單的認爲是參數的做用域的問題,用雙星號定義的字典,僅僅做爲收集參數用的形參,做用域僅在本方法內部,出了方法體就沒人認識這個dic的東西了;相反代碼B中的dic就是原字典的引用,我對這個字典進行操做後,會直接做用到這個字典中,因此代碼B會將默認的字段都添加到須要更新的字典中。若是說的不對,歡迎指教。方法
那麼接下來第二點:
這個就真的比較小兒科了,仍是來比較一段代碼:
代碼C:
# 添加默認字段 def setInsertModel(opt_user_id, dic): # 默認字段元組 common_dic = { 'del_flg': consts.CommonFlg.COM_FLG_OFF.value, 'creator_id': opt_user_id, 'create_dt': DateUtils.getNow(), 'updater_id': opt_user_id, 'update_dt': DateUtils.getNow(), } # 添加默認字段 dic.update(common_dic)
代碼D:
# 添加默認字段 def setInsertModel(opt_user_id, dic): # 默認字段元組 common_dic = { 'del_flg': consts.CommonFlg.COM_FLG_OFF.value, 'creator_id': opt_user_id, 'create_dt': DateUtils.getNow(), 'updater_id': opt_user_id, 'update_dt': DateUtils.getNow(), } # 添加默認字段 dic = dic.update(common_dic) return dic
代碼D在執行插入操做時直接報錯了,TypeError:‘NoneType’。其實道理很是簡單,由於dict.update()方法沒有返回值,dic被賦了NoneType,固然報錯了。