def make_test_dice(*outcomes):
index = len(outcomes) - 1 #定义的外层变量index
def dice():
nonlocal index #声明index是外层变量,而非局部变量
index = (index + 1) % len(outcomes)
return outcomes[index]
return dice
test = make_test_dice(1,2,3) #test不是make_test_dice(1,2,3)本身,而是对dice函数的引用。
print(test()) #1
print(test()) #2
print(test()) #3
print(make_test_dice(1,2,3)()) #1
print(make_test_dice(1,2,3)()) #1
print(make_test_dice(1,2,3)()) #1
test = make_test_dice(1,2,3)
上述代码:
1.make_test_dice只会调用一次,初始化*outcoms和index,
2.并返回dice这个内层函数,这个返回的dice函数包含了*outcoms和index的闭包,
因此test = make_test_dice(),并不是test等于函数make_test_dice()本身,而是对函数dice的引用。当调用test()时,只是在调用返回的dice函数,而不会重新调用make_test_dice()。
而任何对index变量的修改都会直接作用在外层的index上,并保持修改后的值以供下次调用。