鱼C论坛

 找回密码
 立即注册
查看: 1557|回复: 12

[已解决]急急急很急头大

[复制链接]
发表于 2024-6-3 20:05:01 | 显示全部楼层 |阅读模式
9鱼币
def outter():
    def innerA():
        x = 100
   
    def innerB():
        nonlocal x
        x = 250
   
    def innerC():
        global x
        x = 520
   
    x = 880
   
    innerA()
    print(f"调用完 innerA() 函数之后,x = {x}")
   
    innerB()
    print(f"调用完 innerB() 函数之后,x = {x}")
   
    innerC()
    print(f"调用完 innerC() 函数之后,x = {x}")
   
outter()
print(f"此时此刻,全局变量 x = {x}")

我想知道为什么     ||调用完 innerA() 函数之后,x = 880||    没错这就是这个为什么?为什么 innerA() 函数是880
他们都在函数里,是嵌套函数的概念???内部覆盖外部???????880的缩进是4格;100的缩进是8格是缩进的问题????
最佳答案
2024-6-3 20:05:02
鱼油遇到的问题源于Python中的变量作用域和如何在嵌套函数中访问和修改这些变量

变量作用域

在Python中,变量的作用域决定了在哪些部分的代码中可以访问该变量。

具体到代码中,有以下几个作用域:

  • 全局作用域:最外层定义的变量。
  • 局部作用域:在函数内定义的变量。
  • 嵌套函数作用域:在外层函数内部的函数中定义的变量。
  • 内置作用域:Python的内置名称。

在代码中,函数 outter 包含了三个嵌套函数 innerA, innerB, 和 innerC,以及变量 x 的定义。

在 innerA 中,x = 100 是局部变量,它只在 innerA 中有效。因此,这里的赋值不影响外层函数 outter 中的 x。所以,当 innerA 调用完后,outter 中的 x 仍然保持原来的值 880。

innerB 使用了 nonlocal 关键字,这使得 innerB 中的 x 直接引用了外层函数 outter 中的 x。因此,innerB 中将 x 修改为 250 时,实际上修改的是 outter 中的 x。

innerC 使用了 global 关键字。但在此代码中,没有在全局作用域中定义 x,所以当 innerC 尝试设置 x = 520 时,它定义了一个新的全局变量 x。outter 中的 x 不受影响,仍然是由 innerB 设置的 250。

在调用 outter() 之后,输出全局变量 x 的值,这将显示 innerC 设置的全局 x 的值,即 520。


变量 x 的值在 innerA() 调用后仍为 880 的原因是因为在 innerA 中对 x 的修改仅限于 innerA 的局部作用域,不影响外层函数 outter 中的 x。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-4 07:42:07 | 显示全部楼层
tommyyu 发表于 2024-6-3 20:07
innerA 函数调用时相当于有创建了一个只属于自己的局部变量,在执行完该函数后这个变量就消失了。

1.外层作用域是不是outter的参数??
2.当嵌套时没有nonlocal时
   外层的变量会被保存
    程序执行的时候内层变量是不是会被外层变量替换
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-4 07:51:04 | 显示全部楼层
FishC 发表于 2024-6-3 20:05
你好!这个问题其实和缩进没有关系,而是与变量的作用域有关。
在Python中,变量的作用域由其声明的位置决 ...

嵌套函数??
外层的变量不会消失!?
而内层的变量执行一次就一次直接就没了!!??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-4 15:32:30 | 显示全部楼层
aix1a 发表于 2024-6-4 14:34
innerA中x=100的作用域只在这个方法内,不会改变外部变量x,所以他还是880 这是作用域的问题

是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-5 11:09:14 | 显示全部楼层
不二如是 发表于 2024-6-4 22:02
是的,看我给你的解析

OK
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-10 11:05:35 | 显示全部楼层
FishC 发表于 2024-6-4 07:51
是的,嵌套函数中的内层变量只在函数执行期间存在,并且每次调用函数时,都会创建一个新的内层变量。但 ...

你是不是人工+AI??   awa/好奇
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-20 03:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表