鱼C论坛

 找回密码
 立即注册
查看: 154|回复: 2

[已解决]函数作用域的困惑

[复制链接]
发表于 2024-9-4 23:36:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位老师,我写了一个嵌套函数,函数代码如下:
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

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

最佳答案
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 语句的后面,所以,永远不可能被执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 语句的后面,所以,永远不可能被执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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