在这个将点表示法字符串转换为嵌套字典并设置值的解决方案中,我不明白为什么会达到预期的结果。尤其是第 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
我在这里缺少什么细微的差异来解释这种行为?
里面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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句