如果运行此脚本:

def main_function():
    b = 'b'

    def nested_function():
        print(b)
        #b = 'value change'

    nested_function()

main_function()

一切正常.

如果我运行另一个脚本:

def main_function():
    b = 'b'

    def nested_function():
        #print(b)
        b = 'value change'

    nested_function()

main_function()

一切都很好.如您所见,这里我更改了nested\u函数()中的内部行.

但如果我用这两行

def main_function():
    b = 'b'

    def nested_function():
        print(b)
        b = 'value change'

    nested_function()

main_function()

然后,出现了一个错误.

UnboundLocalError:赋值前引用了局部变量"b"

我不明白为什么会这样.

推荐答案

让我们把这些逐一分解.Python的范围规则有时有点混乱.基本思想是,如果将ever赋值给给定函数中的一个变量,那么Python会假定该变量是该特定函数的局部变量.

def main_function():
    b = 'b'

    def nested_function():
        print(b)

    nested_function()

main_function()

在这里,您永远不会在nested_function中指定b,因此Python认为没有必要创建新变量.相反,它从其封闭范围继承了一个.

def main_function():
    b = 'b'

    def nested_function():
        b = 'value change'

    nested_function()

main_function()

在这里,您将do赋值给它,因此您将得到一个新变量.分配给nested_function内部的bunrelated,分配给main_function内部的b.他们只是碰巧有一个共同的名字.

def main_function():
    b = 'b'

    def nested_function():
        print(b)
        b = 'value change'

    nested_function()

main_function()

这里,do赋值,所以Python在函数内部创建了一个新变量,every在嵌套函数中引用b引用了这个新变量,所以就好像这样做了一样.

def main_function():
    b_0 = 'b'

    def nested_function():
        print(b_1)
        b_1 = 'value change'

    nested_function()

main_function()

因此,您试图在分配任何值之前打印出b_1,因此出现了错误.

如果b是一个模块级变量,您可以使用global关键字在函数中标记它.在你的例子中,它是一个局部变量;它不是直接封闭函数的局部函数.所以我们使用nonlocal关键字.

def main_function():
    b = 'b'

    def nested_function():
        nonlocal b
        print(b)
        b = 'value change'

    nested_function()

main_function()

nonlocal b表示"我知道我分配给b,但实际上我的意思是使用封闭范围中的一个".

Python相关问答推荐

并行相乘不同形状的矩阵对

使用pandas MultiIndex进行不连续 Select

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

如何对行使用分段/部分.diff()或.pct_change()?

具有多个组的条形图的不同y标度

按 struct 值对Polars列表[struct[]]排序

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

在内部列表上滚动窗口

Pandas 第二小值有条件

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

将两只Pandas rame乘以指数

如何列举Pandigital Prime Set

为什么默认情况下所有Python类都是可调用的?

如果值发生变化,则列上的极性累积和

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

当点击tkinter菜单而不是菜单选项时,如何执行命令?

计算分布的标准差

字符串合并语法在哪里记录

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

ConversationalRetrivalChain引发键错误