Skip to main content
 首页 » 编程设计

python之重新分配 python 模块的变量,但函数使用该 var 作为默认值不改变

2025年05月04日11webabcd

有示例代码:

# b.py 
c = False 
def d(i=c): 
    print(i, c) 

我想写a.py让b.d的输出为True, True:

# a.py 
import b 
b.c = True 
b.d() 

但输出是False, True。

那么,为什么和如何得到它?


回答后写

为什么:

# `inspect` may be useful 
import inspect 
v = True 
def f(i=v): 
    print(i, v) 
 
s = inspect.signature(f) 
s.parameters 
Out[6]: mappingproxy({'i': <Parameter "i=True">}) 

请您参考如下方法:

这不必要地复杂 - 我们可以将您的问题归结为几行:

default = "Before" 
 
def foo(bar=default): 
    print(bar) 
 
foo()              # "Before" 
default = "After" 
foo()              # "Before" 

您期望的行为似乎是在 default = "After" 之后,调用 foo() 将打印“After”。但它继续打印“之前”。

Python 将评估函数的默认参数一次 并“锁定它”。稍后将 default 的名称重新分配给其他名称无效(如我们在上面的代码片段中所见)。

相反,您可以使用人们希望列表作为默认参数时通常建议的方法:

default = "Before" 
 
def foo(bar=None): 
    if bar is None: 
        bar = default 
    print(bar) 
 
foo()              # "Before" 
default = "After" 
foo()              # "After" 

在这种情况下,您并不是要尝试更改默认参数,而是在未指定参数时更改分配给 bar 的内容。每次调用不带参数的 foo() 时,它都会被赋值为 None,然后函数内部的逻辑将查找并使用全局 的值>默认。