def make_test_dice(*outcomes):
"""Return a die that cycles deterministically through OUTCOMES.
>>> dice = make_test_dice(1, 2, 3)
>>> dice()
1
>>> dice()
2
>>> dice()
3
>>> dice()
1
"""
assert len(outcomes) > 0, 'You must supply outcomes to make_test_dice'
for o in outcomes:
assert type(o) == int and o >= 1, 'Outcome is not a positive integer'
index = len(outcomes) - 1
print("Index1: ", index)
def dice():
nonlocal index
index = (index + 1) % len(outcomes)
print("Index2: ", index)
return outcomes[index]
return dice
def main():
foursided = make_test_dice(4,1,2)
foursided()
foursided()
if __name__ == "__main__": main()
所以我意识到在调用make_test_dice之后,当调用foursided时它会跳过index1 var的打印并转到dice函数,因为这是一个闭包。我理解非局部变量引用封闭范围中的变量,因此更改嵌套函数中的var会在外部更改它,但我不明白的是索引的变量如何存储在嵌套函数中,因为在dice()中设置值时需要一个值索引。鉴于我的print语句,我认为它可能是索引的先前值,但我认为在退出make_test_dice函数的本地帧之后索引将会消失。
答案 0 :(得分:0)
我意识到在调用make_test_dice之后,当调用foursided时它会跳过index1 var的打印并转到dice函数,
根本没有跳过任何内容 - foursided
是“骰子功能”。或者更确切地说,它是在foursided = make_test_dice(4,1,2)
调用期间创建的函数对象 - 每次调用make_test_dice()
都会创建一个新的“骰子”函数。
因为这是一个闭包
看起来你真的不明白闭包是什么。
我理解非局部变量引用封闭范围中的变量,因此更改嵌套函数中的var会在外部更改它,但我不明白的是索引的变量如何存储在嵌套函数中
嗯,这正是闭包的全部内容:它们确实捕获了它们所定义的环境。在Python中,函数是对象(内置function
类的实例),它们只使用实例属性:< / p>
def show_closure(func):
print(func.__closure__)
for cell in func.__closure__:
print(cell.cell_contents)
foursided = make_test_dice(4,1,2)
for i in range(4):
show_closure(foursided)
foursided()