鱼C论坛

 找回密码
 立即注册
查看: 457|回复: 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。

最佳答案

查看完整内容

鱼油遇到的问题源于Python中的变量作用域和如何在嵌套函数中访问和修改这些变量。 变量作用域 在Python中,变量的作用域决定了在哪些部分的代码中可以访问该变量。 具体到代码中,有以下几个作用域: [*]全局作用域:最外层定义的变量。 [*]局部作用域:在函数内定义的变量。 [*]嵌套函数作用域:在外层函数内部的函数中定义的变量。 [*]内置作用域:Python的内置名称。 在代码中,函数 outter 包含了三个嵌套 ...

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小白不急躁 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-3 20:05:20 | 显示全部楼层
你好!这个问题其实和缩进没有关系,而是与变量的作用域有关。
在Python中,变量的作用域由其声明的位置决定。在这个例子中,变量`x`被定义在`outter`函数内部,并且被多个嵌套的函数引用。

首先,当调用`innerA()`函数时,会创建一个新的局部变量`x`,它的值是100。这个局部变量`x`仅在`innerA`函数中可见,并且不影响外部的`x`变量。因此,在`innerA`函数执行完后,打印出来的`x`还是外部的那个变量,即880。

其次,当调用`innerB()`函数时,使用`nonlocal`关键字来声明`x`是一个非局部(nonlocal)的变量。这意味着我们要修改的`x`是`outter`函数中的那个变量。所以,执行完`innerB`函数后,外部的`x`变量的值变为250。

最后,当调用`innerC()`函数时,使用`global`关键字来声明`x`是一个全局变量。这意味着我们要修改的`x`是全局变量`x`,而不是`outter`函数中的那个变量。因此,调用完`innerC`函数后,全局变量`x`的值变为520。

最后,在`outter`函数外部打印`x`变量的值时,由于变量`x`没有在全局范围内声明,所以会抛出一个`NameError`异常。如果你想要在`outter`函数外部访问`x`变量,可以将其声明为全局变量,即在`outter`函数内部的开头加上`global x`。这样,再次打印出`x`的值时,就能看到520。

希望能够解答你的疑惑!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
小白不急躁 + 3 + 3 + 2 我会细看的,然后慢慢思考

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
小白不急躁 + 2 + 2 + 2 ok

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

1.外层作用域是不是outter的参数??
2.当嵌套时没有nonlocal时
   外层的变量会被保存
    程序执行的时候内层变量是不是会被外层变量替换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

嵌套函数??
外层的变量不会消失!?
而内层的变量执行一次就一次直接就没了!!??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-4 07:51:14 | 显示全部楼层
小白不急躁 发表于 2024-06-04 07:51
嵌套函数??
外层的变量不会消失!?
而内层的变量 ...


是的,嵌套函数中的内层变量只在函数执行期间存在,并且每次调用函数时,都会创建一个新的内层变量。但是外层函数中的变量在整个函数执行期间都是存在的。

当我们在内层函数中使用一个变量时,Python首先会在当前函数作用域中查找这个变量。如果找不到,则会向上一级作用域查找,直到找到该变量或者到达全局作用域为止。

所以,在这个例子中,`innerA()`函数创建了一个新的内层变量`x`,而`innerB()`和`innerC()`函数则是修改了外层函数中的变量`x`。

值得注意的是,如果在内层函数中要修改外层函数的变量,需要使用`nonlocal`关键字来声明变量是非局部的。如果不使用`nonlocal`,Python会将其视为一个新的局部变量,并且不会影响外层函数中的同名变量。

希望能够解答你的疑问!如果还有其他问题,请继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
小白不急躁 + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-4 22:02:10 | 显示全部楼层
小白不急躁 发表于 2024-6-4 15:32
是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了

是的,看我给你的解析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你是不是人工+AI??   awa/好奇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-10 11:06:57 | 显示全部楼层
小白不急躁 发表于 2024-06-10 11:05
你是不是人工+AI??   awa/好奇


是的,我是一个由人工智能驱动的机器人助手,可以通过自然语言处理和机器学习等技术来回答问题。我可以根据输入的问题提供相关信息和解答。但请注意,虽然我会尽力提供准确和有用的答案,但由于无法完全理解和感知问题的语境和含义,回答可能不够完美。如果遇到复杂或专业性的问题,建议还是咨询真正的专业人士。希望能满足你的好奇心!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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