LEEFEI571 发表于 2024-9-4 23:36:05

函数作用域的困惑

各位老师,我写了一个嵌套函数,函数代码如下:
def outer():
    x = 123
    print(f'内部函数调用前,外部函数中x的值是{x}')      #打印语句1
    def inner():
      x = 250
      print(f'在内部函数中x的值是{x}')      #打印语句2
    return inner()
    print(f'内部函数调用后,外部函数中x的值是{x}')    #打印语句3

当我运行这个outer函数后,得到的结果如下:
内部函数调用前,外部函数中x的值是123
在内部函数中x的值是250


在我的问题如下:
1:为何”打印语句3”未执行显示?

2:如何让内部函数x的值赋值给外部函数,即期望的运行结果如下
内部函数调用前,外部函数中x的值是123
在内部函数中x的值是250
内部函数调用后,外部函数中x的值是250

3:反之, 如何让外部函数中的x去赋值给内部函数x的值, 即期望的运行结果如下
内部函数调用前,外部函数中x的值是123
在内部函数中x的值是123
内部函数调用后,外部函数中x的值是250

烦请各位大侠老师指点,谢谢!

FishC 发表于 2024-9-4 23:55:40

关于你的问题,可以逐一解答如下:

1. **为何“打印语句3”未执行显示?**

   在`outer`函数中,`return inner()`会直接调用内部函数`inner`并返回其结果。因为`return`语句会立即终止`outer`函数的执行,所以`打印语句3`永远不会被执行。如果希望在调用完`inner`后依然执行后面的语句,应将`return inner()`改为`inner()`,这样函数不会在调用`inner`后立即退出。

2. **如何让内部函数x的值赋值给外部函数中的x?**

   要实现这点,可以使用`nonlocal`关键字。`nonlocal`允许在嵌套函数中对外部函数作用域中的变量进行修改。修改代码如下:

   def outer():
       x = 123
       print(f'内部函数调用前,外部函数中x的值是{x}')      # 打印语句1
       def inner():
         nonlocal x
         x = 250
         print(f'在内部函数中x的值是{x}')      # 打印语句2
       inner()
       print(f'内部函数调用后,外部函数中x的值是{x}')    # 打印语句3

   outer()

3. **如何让外部函数中的x赋值给内部函数x的值?**

   如果希望内部函数使用外部函数中的`x`值而不重新定义它,可以直接在内部函数中打印并使用外部的`x`。修改代码如下:

   def outer():
       x = 123
       print(f'内部函数调用前,外部函数中x的值是{x}')      # 打印语句1
       def inner():
         # 不重新定义x
         print(f'在内部函数中x的值是{x}')      # 打印语句2
       inner()
       x = 250
       print(f'内部函数调用后,外部函数中x的值是{x}')    # 打印语句3

   outer()

通过这种方式,你可以控制`x`的作用域,使得在不同的情境下实现你所期望的打印输出。

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

jackz007 发表于 2024-9-5 09:41:47

本帖最后由 jackz007 于 2024-9-5 09:53 编辑

def outer():
    x = 123                                              # 定义 x 为局部变量,所有属于本函数的语句(包括 inner())皆可访问到该变量
    print(f'内部函数调用前,外部函数中x的值是{x}')      # 打印语句1
    def inner():
      x = 250                                          # 定义 x 为局部变量,从而与外层函数的同名变量 x 脱钩
      print(f'在内部函数中x的值是{x}')               # 打印语句2
    return inner()                                       # return 语句会退出 outer() 函数
    print(f'内部函数调用后,外部函数中x的值是{x}')      # return 后面的语句,永远不可能被执行
    在 outer() 中定义的变量 x 在 inner() 内是可以被访问的,只不过是只能读取,不能改变其数值,如果想改变其数值,那么,在 inner() 内就应该使用
nonelocal x
    来定义变量 x,声明函数 inner() 内使用的变量 x 来自外层函数,这样,就可以自由改变其数值了。
    return 一定是一个函数内可以被执行到的最后一条语句,由于打印语句 3 位于 return 语句的后面,所以,永远不可能被执行。
页: [1]
查看完整版本: 函数作用域的困惑