python关于函数和嵌套函数中的外层变量在内层操作(如何在函数内操作全局变量,或如何在内层函数操作外层函数的变量)

注意标题,这里讲的是“操作变量”,而不单纯是“修改变量”,”修改“有更多方法,比如直接return一个新的值给原来的变量,也能做到“修改”的效果,而“操作”是指在函数中直接操作这个变量,用的是这个变量的值,改的也是这个变量的值,包括变量的调用、输入和输出。

在C语言中,如果想要用一个函数去操作外部的值,可以直接取变量的地址传入函数,然后通过解引用去操作外部变量。

在C++中,也可以直接用变量的引用去操作它。

但是在python里,既没有指针也没有引用(注意这里的引用不是指import,而是C++中的一种语法),那么该如何实现“在函数内部修改外部变量的值”呢?

下面举几个例子,我们一起探索。

首先讲在函数内修改全局变量

例1:直接在函数内使用外部变量名进行操作(失败)

def func1_1():

    #这里定义一个func1_2,是为了后面验证内层函数如何修改外层函数变量,在此处并无实际作用
    def func1_2():
        a=2
        print("进入func1_2之后",a)

    #注意上面三行是我定义的内部函数,func1_1真正是从下面开始执行

    a=1
    print("进入func1_1之后,进入func1_2之前",a)
    func1_2()
    print("出了func1_2之后",a)

#注意上面是我定义的函数,真正的代码从下面开始执行

a=0
print("进入func1_1之前",a)
func1_1()
print("出了func1_1之后",a)

运行结果如下:

可以看到,func1_1和func1_2并没有真正修改全局变量a的值,只是重新在函数内部定义了一个变量a,出了函数便会自动销毁掉

例2:使用global关键字(成功)

def func2_1():

    def func2_2():
        global a
        a=2
        print("进入func2_2之后",a)

    #注意上面三行是我定义的内部函数,func2_1真正是从下面开始执行

    global a
    a=1
    print("进入func2_1之后,进入func2_2之前",a)
    func2_2()
    print("出了func2_2之后",a)

#注意上面是我定义的函数,真正的代码从下面开始执行

print("进入func2_1之前",a)
func2_1()
print("出了func2_1之后",a)

 运行结果如下:

 可以看到,func2_1和func2_2都成功修改了全局变量a的值,这是因为global关键字将变量a声明为全局变量,所以可以在函数内实现对外部的全局变量a的操作,除了单纯的输出,还可以直接调用a,或对a进行输入

接下来讲在内部函数操作外部函数中定义的变量

直接看代码:

def func3_1():

    def func3_2():
        b=1
        print("进入func3_2之后",b)

    def func3_3():
        global b
        b=1
        print("进入func3_3之后",b)

    def func3_4(tmp):
        tmp=1
        print("进入func3_4之后",tmp) 

    def func3_5():
        nonlocal b
        b=1
        print("进入func3_5之后",b)

    #注意上面是对各个内部函数的定义,实际func3_1的代码从下面开始执行

    b=0
    print("进入func3_2之前",b)
    func3_2()
    print("出了func3_2之后",b)

    print("进入func3_3之前",b)
    func3_3()
    print("出了func3_3之后",b)

    print("进入func3_4之前",b)
    func3_4(b)
    print("出了func3_4之后",b)

    print("进入func3_5之前",b)
    func3_5()
    print("出了func3_5之后",b)

#注意上面是对函数func3_1的定义,实际代码从下面开始执行

print("进入func3_1之前,没有b")
func3_1()

运行结果如下:

我们一个一个看:

我们在func3_1这个外部函数里定义了一个变量b=0

首先进入func3_2:

我们单纯地对变量名进行操作,发现出了func3_2之后外部的b值并没有变化,可知,func3_2只是重新在函数内部定义了一个变量b,出了func3_2便会自动销毁掉

 然后进入func3_3:

我们尝试用关键字global去声明b为全局变量,显然这是行不通的,因为b本来就不是全局变量,得到的结果也同样证明,外部func3_1中的b的值并没有发生变化,实际func3_3进行的操作和func3_2相同

再进入func3_4:

这个函数就是把b作为参数传进去,实际上是在函数内创建了一个和实际参数b一样的形式参数tmp,这里实现的是对tmp的操作,对b的实际值并没有任何影响

这和C/C++里的传值操作完全相同。

其实用return对b返回一个值也是相同的道理,都没有实现真正意义上对b进行操作。

最后进入func3_5:

这里我们用了一个关键字“nonlocal”,这是在python3之后新添加的一个关键字,如果一个变量既不是全局变量,也不是当前函数中的局部变量,那么用nolocal对它进行声明,就可以对其进行操作(说白了就是在内部函数操作外部函数的变量)

当然,在此之前也有一种方法,那就是将变量存储在容器中(比如列表)b=[0],这样内部函数也可以直接访问并操作b[0]

(其实在发现nonlocal这个关键字之前我一直都这么做的)

突然想到闭包

关于python中的闭包,已经有很多大佬讲的很清楚了,指路一下,大家去看就好了:

(1条消息) python 闭包和装饰器详解_探索未知的自己的博客-优快云博客_python闭包和装饰器

(1条消息) [Python小记] 通俗的理解闭包 闭包能帮我们做什么?_城市里的元的博客-优快云博客

<think>好的,我现在需要回答用户关于在Python函数内部修改全局变量的问题,特别是使用globalnonlocal关键字的示例。首先,我要确保自己理解这两个关键字的区别正确用法。 用户的问题明确提到在函数内部修改全局变量的方法,涉及globalnonlocal关键字。根据已有的引用资料,比如引用[3]提到global用于在函数修改全局变量,而nonlocal用于嵌套函数修改外层全局变量。引用[4]也举例说明了两者的不同作用层级。我需要用简单明了的中文解释这两个关键字,并给出示例代码。 首先,我应该先介绍全局变量的基本概念,然后说明在函数内部直接修改全局变量会遇到的问题,比如会创建一个同名的局部变量而不是修改全局变量。这时候就需要使用global关键字来声明该变量是全局的。接下来,给出一个使用global的示例代码,展示如何正确修改全局变量。 然后,需要解释nonlocal关键字的用途。它主要用于嵌套函数中,当需要修改外层(非全局)作用域的变量时使用。例如,在外部函数定义了一个变量内部函数想要修改它,就需要用nonlocal声明。同样,给出一个示例代码来说明这种情况,并与global的情况进行对比,避免混淆。 需要注意语法正确性,比如globalnonlocal的声明位置,变量的作用域范围。同时,要确保示例代码简洁易懂,能够直观展示关键字的效果。比如引用[3]中的示例就很好地展示了global的使用,而引用[4]对比了globalnonlocal的不同作用对象,这可以作为参考。 可能还需要区分globalnonlocal的不同使用场景,避免用户混淆。例如,global作用于全局变量,而nonlocal作用于外层函数的局部变量。要提醒用户,如果在没有嵌套函数的情况下使用nonlocal会导致错误,者在没有声明global的情况下修改全局变量会引发UnboundLocalError。 此外,要检查是否有遗漏的情况,比如在多层嵌套函数中nonlocal的行为,者当同时存在同名的全局变量非全局外层变量时,关键字如何影响变量的查找顺序。不过根据用户的问题,可能不需要深入这些细节,保持回答简洁即可。 最后,按照用户的要求生成相关问题,帮助用户进一步学习。比如询问globalnonlocal的区别,者在不使用global的情况下如何访问全局变量,以及nonlocal的常见错误用法。 总结一下,回答的结构应该是: 1. 全局变量的基本概念直接修改的问题 2. global关键字的用法示例 3. nonlocal关键字的适用场景示例 4. 对比两者区别 5. 注意事项常见错误 6. 生成相关问题 需要确保使用正确的中文表达,避免技术术语使用不当,同时引用资料中的示例要正确标注引用标识。比如在提到global示例时引用[3],提到nonlocal时引用[4]。此外,代码块要使用正确的格式,行内公式如果有的话需要用$...$,但在这个问题中可能不需要数学公式,所以主要关注代码示例的正确性。 现在开始组织语言,确保每个部分清晰,步骤明确,示例代码正确,并且自然引用相关文献。同时检查是否有违反系统级指令的地方,比如是否正确使用$$格式(这里可能不需要),是否结构清晰,有无生成相关问题等。</think>在Python中,若需在函数内部修改全局变量外层全局变量,需使用`global``nonlocal`关键字。以下是具体方法及示例: --- ### 1. **`global`关键字:修改全局变量** - **问题**:若直接在函数内赋值全局变量Python会默认创建一个同名局部变量,而非修改全局变量。 - **解决方法**:在函数内用`global`声明变量,明确引用全局作用域的变量。 #### 示例代码 ```python x = 10 # 全局变量 def modify_global(): global x # 声明使用全局变量x x = 20 # 修改全局变量 modify_global() print(x) # 输出: 20 [^3] ``` --- ### 2. **`nonlocal`关键字:修改嵌套函数中的外层变量** - **适用场景**:在嵌套函数中,修改外层函数(非全局作用域)的变量。 - **注意**:`nonlocal`不能用于全局变量,仅适用于闭包环境中的外层局部变量。 #### 示例代码 ```python def outer(): name = "aa" # 外层函数的局部变量 def inner(): nonlocal name # 声明使用外层变量name name = "bb" # 修改外层变量 inner() print(name) # 输出: bb [^4] outer() ``` --- ### 3. **`global`与`nonlocal`的区别** | 关键字 | 作用域 | 典型场景 | |------------|----------------------|---------------------------| | `global` | 全局作用域 | 函数修改全局变量 | | `nonlocal` | 外层非全局作用域 | 嵌套函数修改外层变量 | #### 示例对比 ```python name = "xhg" # 全局变量 def outer(): name = "aa" # 外层全局变量 def inner(): global name # 引用全局变量 name = "global_changed" nonlocal name # 错误!此处与global冲突,应改为nonlocal外层变量 inner() outer() print(name) # 输出: global_changed ``` > **注意**:`nonlocal``global`不能同时作用于同名变量。 --- ### 4. **注意事项** - **未声明时的报错**:直接修改全局变量会触发`UnboundLocalError`。 - **多层嵌套**:`nonlocal`会逐层向外查找变量,若未找到则报错。 - **替代方案**:通过返回值可变类型(如列表)间接修改值。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值