gpt4 book ai didi

python - 使用跨多个模块共享的变量作为默认函数参数

转载 作者:行者123 更新时间:2023-11-28 22:10:20 25 4
gpt4 key购买 nike

手头的问题最好用这个包含 3 个脚本的最小示例来说明:

foo.py

global_val = [0]

bar.py

from foo import global_val

def work(val=global_val[0])
print("global_val: ", global_val[0])
print("val: ", val)

主.py

from bar import work
import foo

if __name__ == '__main__':
foo.global_val[0] = 1
work()

我期望的输出是:

global_val: 1
val: 1

实际输出:

global_val: 1
val: 0

我不明白为什么 bar.pyval 的默认参数不是 1。我很困惑,因为我在调用 work() 之前明确更新了 global_val,但由于某种原因,旧值仍用作默认函数参数。

global_val 被导入 bar.py 时,默认参数似乎以某种方式预先计算。难道 Python 代码不应该在运行时动态编译吗?

如果有帮助的话,我正在使用 Python 3.6。

最佳答案

关键是 def work(val=global_val[0]): 在导入时进行评估(例如,当 from bar import work 中被命中时main.py.) Python 中函数的默认参数在函数 is defined 时计算并存储在其signature ( here's how you can inspect them ) 中。

因此,操作顺序是:

  1. 运行main.py
  2. 从酒吧导入工作
  3. 找到并加载bar
  4. from foo import global_val
  5. 定位并加载foo
  6. def work(val=global_val[0]):
  7. 构造一个名为 work 的函数并评估其默认参数 (global_val[0] == 0)
  8. foo.global_val[0] = 1
  9. 调用工作

关于python - 使用跨多个模块共享的变量作为默认函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com