运行时能否修改字典内变量?字典动态调用列表元素函数问题
问题分析与解决方案
这问题我太熟悉了!你遇到的核心问题是Python赋值时会立即计算右侧表达式的值,而不是保留表达式的“动态引用”。
为什么你的代码达不到预期?
当你执行这行代码时:
myDict = { "test" : myList[index].foo }
Python会立刻计算myList[index].foo的结果——此时index是0,所以它直接把myList[0].foo这个方法的引用存进了字典。后续你修改index的值,字典里已经存储的是之前那个方法的固定引用,完全不会再去读取新的index值。
怎么修复?
你需要让字典里的“值”变成一个会延迟计算的逻辑,每次调用时才去获取当前index对应的对象方法。有两种简单的实现方式:
方式1:使用lambda函数
把字典的值定义为一个lambda,这样每次调用myDict["test"]()时,都会重新执行myList[index].foo():
index = 0 myDict = { "test" : lambda: myList[index].foo() } myDict["test"]() # 此时index=0,调用myList[0].foo() index += 1 myDict["test"]() # 此时index=1,调用myList[1].foo()
如果你的foo方法需要接收参数,只需要给lambda加上对应的参数即可:
myDict = { "test" : lambda x, y: myList[index].foo(x, y) }
方式2:封装成普通函数
如果觉得lambda不够直观,也可以写一个普通函数来封装这个逻辑:
def call_current_foo(): return myList[index].foo() index = 0 myDict = { "test" : call_current_foo } myDict["test"]() index += 1 myDict["test"]()
这种方式和lambda原理一致,都是每次调用时才去读取当前的index值,动态获取对应的方法。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

