【问题标题】:Python Reference Language: nonlocal definitionPython 参考语言:非本地定义
【发布时间】:2018-04-24 19:09:21
【问题描述】:

this paragraph,可以找到以下句子(我的重点):

与全局语句中列出的名称不同,非本地语句中列出的名称必须引用封闭范围内的预先存在的绑定(不能明确确定应该创建新绑定的范围)。

我用括号中的粗体句子来解释前面的句子意思是为了使诸如nonlocal a之类的非本地语句正确,诸如a = 1之类的语句在决定要在哪个命名空间中应该有问题在本地命名空间或封闭命名空间中添加(或修改)绑定(因为存在这样的命名空间已经包含名称 a 的绑定)。

这样对吗,是不是故意的?

如果是,我相信即使a 是全局的情况下(括号中的)措辞也适用,因为“不能明确地确定应该创建新绑定的范围”,这不是故意的。我对么?

【问题讨论】:

    标签: python scope


    【解决方案1】:

    语言参考是说外部范围内的某些语句必须创建变量供nonlocal 参考。例如,这很好:

    def f():
        def g():
            a = 3
            def h():
                def i():
                    nonlocal a
                    print(a)
    

    但这不是:

    def f():
        def g():
            def h():
                def i():
                    nonlocal a
                    print(a)
    

    因为在第一个 sn-p 中,Python 可以判断 nonlocal 应该使用来自 g 函数的 a 变量。在第二个 sn-p 中,Python 必须在其中一个封闭函数中创建一个新的 a 变量,但它不知道是哪个。

    【讨论】:

    • 是的,我明白这一点,并且我认为句子的第一部分解释得很清楚:“在非本地语句中列出的名称,与在全局语句中列出的名称不同,必须参考前- 封闭范围内的现有绑定”。我想知道句子其余部分的正确性:“(无法明确确定应该创建新绑定的范围)。”。
    • @user42768:括号中的部分是说,如果没有现有的绑定,Python 将不得不创建一个新的绑定,它不知道在哪里做。
    • 我不明白您是如何从中获得“诸如 a = 1 之类的语句在决定在哪个命名空间中添加(或修改)绑定时应该有问题”的。赋值语句不是非局部语句,并且不使用相同的规则。
    • 我发现:“以下构造绑定名称:函数的形式参数、导入语句、类和函数定义(这些绑定定义块中的类或函数名称)和 目标如果出现在分配中,它们就是标识符 [...]”。因此,我相信赋值语句会创建绑定。至于措辞,如果是这个意思,为什么不说:“[...] 必须引用封闭范围内的预先存在的绑定。如果不能明确确定范围,则该语句是非法的。”?
    • @user42768 看第二个例子。由于a 尚未在i 的本地范围之外定义,应该在哪里创建它?在hgf?无法判断用户的意图是什么。使用global,没有问题,因为只有一个全局范围。
    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多