在這個將點表示法字串轉換為嵌套字典并設定值的解決方案中,我不明白為什么會達到預期的結果。尤其是第 4 行看起來不太對勁。所以我嘗試了
obj, path, value = {}, 'test.test1', 10
*path, last = path.split(".")
for bit in path:
obj = obj.setdefault(bit, {})
obj[last] = value
print(obj)
輸出
{'test1': 10}
這證實了我的懷疑,因為預期的結果是{'test': {'test1': 10}}。
但是當代碼(添加print陳述句以查看正在發生的情況)在函式內部運行時,字典僅在函式呼叫之外更改為所需的結果。
def setv(obj, path, value):
*path, last = path.split(".")
for bit in path:
obj = obj.setdefault(bit, {})
print(obj)
obj[last] = value
print(obj)
obj, path, value = {}, 'test.test1', 10
setv(obj, path, value)
print(obj)
輸出
{} # inside the function call
{'test1': 10} # inside the function call
{'test': {'test1': 10}} # after the function call
我在這里缺少什么細微的差異來解釋這種行為?
uj5u.com熱心網友回復:
里面setv,在它被列印的時候,obj是一個區域變數,因為有一個 assignment obj = ...。
賦值遮蔽了全域變數(或引數,它們是相同的)obj。
您也可以通過列印來驗證它id(obj)。
globalobj是一個包含對 local 的參考的字典,這一事實obj使這更加令人困惑,但實際上并不重要。對于更簡單的物件也可以觀察到相同的情況:
>>> def f(a):
... print(a)
... a = 7
... print(a)
...
>>> a = 10
>>> f(a)
10
7
>>> print(a)
10
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453488.html
