這個問題在這里已經有了答案: “最小驚訝”和可變默認引數 (32 個答案) 2天前關閉。
我撰寫了一個函式來查找兩個嵌套字典中的不同鍵。我深受這個答案的啟發。
def find_diff_keys(d1: dict, d2: dict, not_included_keys:list = [], path=""):
for k in d1:
if k in d2:
if type(d1[k]) is dict:
find_diff_keys(d1[k],d2[k],not_included_keys, "%s.%s" % (path, k) if path else k)
else:
if type(d1[k]) is dict:
not_included_keys.append("%s" % path if path else k) # For Root Valuess
for sub_k in d1[k]:
not_included_keys.append("%s.%s" % (k, sub_k))
continue
not_included_keys.append("%s.%s" % ("%s" % path if path else "", k))
return not_included_keys
現在假設我們有兩個嵌套字典:a 和 b。如果我想獲得這兩個詞典的差異,我會運行以下命令。請注意,我沒有指定一個空串列作為not_included_keys引數...
print("The following keys are included in A but not in B:")
diff_a_to_b = find_diff_keys(ini_dict_a, ini_dict_b)
pprint(diff_a_to_b)
print("")
print("The following keys are included in B but not in A:")
diff_b_to_a = find_diff_keys(ini_dict_b, ini_dict_a)
pprint(diff_b_to_a)
其輸出將是:
The following keys are included in A but not in B:
['FAIL.WEAREDOINGSOMETHING',
'FAIL.ehh',
'FAIL.dsa',
'FAIL.fds',
'FAIL.gd',
'FAIL.ewq',
'TESTVALUE',
'TESTVALUE.Name',
'TESTSUBSUB.TestValues2',
'TESTSUBSUB.TestValues2ltaHz']
The following keys are included in B but not in A:
['FAIL.WEAREDOINGSOMETHING',
'FAIL.ehh',
'FAIL.dsa',
'FAIL.fds',
'FAIL.gd',
'FAIL.ewq',
'TESTVALUE',
'TESTVALUE.Name',
'TESTSUBSUB.TestValues2',
'TESTSUBSUB.TestValues2ltaHz']
現在,如果我以空串列作為引數運行該函式:
diff_a_to_b = find_diff_keys(ini_dict_a, ini_dict_b, [])
diff_b_to_a = find_diff_keys(ini_dict_b, ini_dict_a, [])
輸出將是:
The following keys are included in A but not in B:
['FAIL.WEAREDOINGSOMETHING',
'FAIL.ehh',
'FAIL.dsa',
'FAIL.fds',
'FAIL.gd',
'FAIL.ewq',
'TESTVALUE',
'TESTVALUE.Name',
'TESTSUBSUB.TestValues2',
'TESTSUBSUB.TestValues2ltaHz',
'TESTSUBSUB.TestValues2eltaHz']
The following keys are included in B but not in A:
['PointsConfig.130324',
'ResetAlarm.NotEnabledValue',
'ResetAlarm.SomeValue',
'PointsConfig.13032402.Mains.Some_small_difference']
有人能理解為什么在第一種方法中 python 只是復制舊串列,而在第二種方法中,函式做了它應該做的事情嗎?
uj5u.com熱心網友回復:
不要使用可變物件作為默認引數。(串列、字典等)
改為這樣做。
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to
為什么?因為例如串列或字典是可變的,這意味著您在整個代碼中編輯相同的參考。并且python在定義函式時創建串列,而不是在呼叫它時,因為函式是python中的一等公民。
欲了解更多資訊:https ://docs.python-guide.org/writing/gotchas/#mutable-default-arguments
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473200.html
