Python 声明为非局部集的嵌套函数中变量的值是多少?

Python 声明为非局部集的嵌套函数中变量的值是多少?,python,python-3.x,closures,python-nonlocal,Python,Python 3.x,Closures,Python Nonlocal,因此,我意识到在调用make_test_dice之后,当调用Fourside时,它会跳过index1变量的打印,并转到dice函数,因为这是一个闭包。我知道非局部变量指的是封闭范围内的变量,因此在嵌套函数中更改变量会在外部更改变量,但我不理解的是索引变量如何存储在嵌套函数中,因为在骰子中设置值时需要值索引。鉴于我的print语句,我相信它可能是index的前一个值,但我认为在退出make_test_dice函数的局部框架后,index将消失 我意识到在调用make_test_dice之后,当调用

因此,我意识到在调用make_test_dice之后,当调用Fourside时,它会跳过index1变量的打印,并转到dice函数,因为这是一个闭包。我知道非局部变量指的是封闭范围内的变量,因此在嵌套函数中更改变量会在外部更改变量,但我不理解的是索引变量如何存储在嵌套函数中,因为在骰子中设置值时需要值索引。鉴于我的print语句,我相信它可能是index的前一个值,但我认为在退出make_test_dice函数的局部框架后,index将消失

我意识到在调用make_test_dice之后,当调用Fourside时,它会跳过index1 var的打印并转到dice函数

没有跳过任何东西-四边形是骰子功能。或者,更准确地说,它是在Fourside=make_test_dice 4,1,2调用期间创建的函数对象-每次调用make_test_dice都会创建一个新的dice函数

因为这是一个结束

看起来你真的不明白闭包到底是什么

我知道非局部变量指的是封闭范围内的变量,因此在嵌套函数中更改变量会在外部更改变量,但我不理解的是索引变量如何存储在嵌套函数中

好吧,这正是闭包的意义所在:它们确实捕获了定义它们的环境。在Python中,函数是内置函数类的对象实例,它们只使用实例属性:

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()

请不要重复问题,正如我说的,阅读非局部的,我读了非局部的,但它没有回答函数调用之间索引变量是如何存储的。我知道非局部使外部函数作用域中的变量在内部作用域中可变,而不创建同名的新变量,但这并不能回答我的主要问题。你似乎不理解非局部,因为这解释了索引是如何更新的,它有点像全局的。试试这个,x=0,然后定义f:global x:x+=1,然后调用f多次并打印x
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()