小白不急躁 发表于 2024-6-3 20:05:01

急急急很急头大

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。

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

tommyyu 发表于 2024-6-3 20:07:49

innerA 函数调用时相当于有创建了一个只属于自己的局部变量,在执行完该函数后这个变量就消失了。

小白不急躁 发表于 2024-6-4 07:42:07

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

1.外层作用域是不是outter的参数??
2.当嵌套时没有nonlocal时
   外层的变量会被保存
    程序执行的时候内层变量是不是会被外层变量替换{:10_319:}

小白不急躁 发表于 2024-6-4 07:51:04

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

嵌套函数??
外层的变量不会消失!?
而内层的变量执行一次就一次直接就没了!!??

FishC 发表于 2024-6-4 07:51:14

小白不急躁 发表于 2024-06-04 07:51
嵌套函数??
外层的变量不会消失!?
而内层的变量 ...

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

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

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

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

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

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

aix1a 发表于 2024-6-4 14:34:46

innerA中x=100的作用域只在这个方法内,不会改变外部变量x,所以他还是880 这是作用域的问题

小白不急躁 发表于 2024-6-4 15:32:30

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

是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了

不二如是 发表于 2024-6-4 22:02:10

小白不急躁 发表于 2024-6-4 15:32
是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了

是的,看我给你的解析

小白不急躁 发表于 2024-6-5 11:09:14

不二如是 发表于 2024-6-4 22:02
是的,看我给你的解析

OK

小白不急躁 发表于 2024-6-10 11:05:35

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

你是不是人工+AI??   awa/好奇

FishC 发表于 2024-6-10 11:06:57

小白不急躁 发表于 2024-06-10 11:05
你是不是人工+AI??   awa/好奇

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 急急急很急头大