在Python 3
附加功能对象列表时,订单是否可能会丢失?
我的理解是Python列表已经订购并且确实正在运行
numbers = []
for i in range(10):
numbers.append(i)
print(numbers)
按预期返回[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。
如果我追加功能对象,就像在这个MWE中那样:
functions = []
for k in range(10):
def test():
print('This is the %i th function.' %k)
functions.append(test)
并致电functions[2]()
我得到This is the 9 th function.
有人能理解这种奇怪的行为吗?
答案 0 :(得分:2)
函数闭包在定义变量时不会捕获变量的值,它会捕获变量的名称。
因此,您在functions[2]
中存储的函数引用k
。当你调用它时,它会在调用它时显示k
的值,而不是在它被定义时。