急急急很急头大
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格是缩进的问题???? 鱼油遇到的问题源于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中,变量的作用域由其声明的位置决定。在这个例子中,变量`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 小助理,如未能正确解答您的问题,请继续追问。 innerA 函数调用时相当于有创建了一个只属于自己的局部变量,在执行完该函数后这个变量就消失了。 tommyyu 发表于 2024-6-3 20:07
innerA 函数调用时相当于有创建了一个只属于自己的局部变量,在执行完该函数后这个变量就消失了。
1.外层作用域是不是outter的参数??
2.当嵌套时没有nonlocal时
外层的变量会被保存
程序执行的时候内层变量是不是会被外层变量替换{:10_319:}
FishC 发表于 2024-6-3 20:05
你好!这个问题其实和缩进没有关系,而是与变量的作用域有关。
在Python中,变量的作用域由其声明的位置决 ...
嵌套函数??
外层的变量不会消失!?
而内层的变量执行一次就一次直接就没了!!?? 小白不急躁 发表于 2024-06-04 07:51
嵌套函数??
外层的变量不会消失!?
而内层的变量 ...
是的,嵌套函数中的内层变量只在函数执行期间存在,并且每次调用函数时,都会创建一个新的内层变量。但是外层函数中的变量在整个函数执行期间都是存在的。
当我们在内层函数中使用一个变量时,Python首先会在当前函数作用域中查找这个变量。如果找不到,则会向上一级作用域查找,直到找到该变量或者到达全局作用域为止。
所以,在这个例子中,`innerA()`函数创建了一个新的内层变量`x`,而`innerB()`和`innerC()`函数则是修改了外层函数中的变量`x`。
值得注意的是,如果在内层函数中要修改外层函数的变量,需要使用`nonlocal`关键字来声明变量是非局部的。如果不使用`nonlocal`,Python会将其视为一个新的局部变量,并且不会影响外层函数中的同名变量。
希望能够解答你的疑问!如果还有其他问题,请继续提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 innerA中x=100的作用域只在这个方法内,不会改变外部变量x,所以他还是880 这是作用域的问题 aix1a 发表于 2024-6-4 14:34
innerA中x=100的作用域只在这个方法内,不会改变外部变量x,所以他还是880 这是作用域的问题
是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了 小白不急躁 发表于 2024-6-4 15:32
是不是880的作用域是有记忆的,执行一次后不会消失
100的是没有记忆,执行后就没了
是的,看我给你的解析 不二如是 发表于 2024-6-4 22:02
是的,看我给你的解析
OK FishC 发表于 2024-6-4 07:51
是的,嵌套函数中的内层变量只在函数执行期间存在,并且每次调用函数时,都会创建一个新的内层变量。但 ...
你是不是人工+AI?? awa/好奇 小白不急躁 发表于 2024-06-10 11:05
你是不是人工+AI?? awa/好奇
是的,我是一个由人工智能驱动的机器人助手,可以通过自然语言处理和机器学习等技术来回答问题。我可以根据输入的问题提供相关信息和解答。但请注意,虽然我会尽力提供准确和有用的答案,但由于无法完全理解和感知问题的语境和含义,回答可能不够完美。如果遇到复杂或专业性的问题,建议还是咨询真正的专业人士。希望能满足你的好奇心!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]