Python函数将getter调用作为默认参数时取值不符合预期是什么原因
Python默认参数行为差异原因解析
核心原理
Python的函数默认参数仅在函数定义阶段被计算一次,后续所有未显式传入该参数的调用,都会直接复用首次计算得到的默认值,不会重新执行默认值对应的表达式。
对应到你的示例代码:
你定义def move_selected(file_i = test.get()):的时候,就已经执行了一次test.get(),此时test实例的_val初始值为0,所以file_i的默认值就被固定为0。之后无论你调用多少次无参数的move_selected(),都会直接用这个提前算好的0,不会每次调用时重新获取test的最新值,所以才会出现默认参数调用时file_i一直是0的现象。
而你显式传入test.get()调用的时候,这个表达式是在每次函数调用前当场计算的,会取调用时刻test的最新值,因此结果和默认参数调用的结果不同。
函数调用作为默认参数的使用建议
不是完全不能将函数调用作为默认参数,需要分场景判断:
- 如果函数调用的结果是固定不变的、无副作用的,可以直接作为默认参数使用,不会有问题。
- 如果函数调用的结果会随上下文变化、或者存在副作用,不要直接作为默认参数。如果要实现「每次调用不传参就执行该表达式取最新值」的效果,标准写法是用
None作为占位符,在函数内部执行对应逻辑:
def move_selected(file_i = None): global test # 仅在未传参时执行get调用取最新值 if file_i is None: file_i = test.get() test.increment() print(file_i) print(test)
修改后每次无参数调用都会拿到调用时刻test的最新值,符合预期逻辑。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

