为什么字典似乎在函数中的最后一条语句和函数调用后的第一条语句之间发生变化?

迈克尔·什琴斯尼

这个将点表示法字符串转换为嵌套字典并设置值的解决方案中,我不明白为什么会达到预期的结果。尤其是第 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

我在这里缺少什么细微的差异来解释这种行为?

战士1

里面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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java中的“构造函数调用必须是构造函数中的第一条语句”问题

语法错误:构造函数调用必须是构造函数中的第一条语句

调用super()必须是构造函数主体中的第一条语句

调用super必须是构造函数中的第一条语句,但这是

为什么函数在C中返回一条语句?

继承的构造函数java:对super()的调用必须是第一条语句

SQL:为什么“CREATE VIEW”必须是查询批处理中的第一条语句?

如何获取组之间的第一条记录和最后一条记录?

重载的构造函数调用其他构造函数,但不作为第一条语句

如果变量值在python中发生变化,我该如何打印一条语句?

我的函数在第一条语句后不返回运行

如果try抛出异常,为什么在第一条语句后尝试退出?

为什么在while循环中跳过第一条语句?

ESlint是否有关于函数中第一条语句之前的空白行的规则?

删除ggplot的第一条和最后一条记录之间的连接线

命名空间声明语句必须是脚本中的第一条语句

选择每组的第一条和最后一条记录

检索每组的第一条和最后一条记录

在某些假设下选择连接的第一条和最后一条记录

获取每组的第一条和最后一条记录

水平选择每个组的第一条记录和最后一条记录

MariaDB 获取当月的第一条和最后一条记录 - 嵌套查询

根据条件选择第一条和最后一条记录

删除高图中的第一条和最后一条网格线?

构造函数的第一条陈述

确定Excel中每个日期的第一条和最后一条合格记录

分区表并在谷歌大查询中获取第一条和最后一条记录

在mysql子查询中按日期获取第一条记录和最后一条记录的值

如何使用MySQL连接表中的第一条记录和最后一条记录?