鱼C论坛

 找回密码
 立即注册
查看: 1756|回复: 5

[已解决]嵌套函数

[复制链接]
发表于 2022-4-13 19:56:57 | 显示全部楼层 |阅读模式

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

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

x
想请教下大神为什么我这个内嵌函数的返回的return talk_这个列表,在外层函数中并没有执行。。。


def save_files(file_name,name):
    '''name必须为人名:'''
    import pickle
   
    def save_files():
        '''将文件要保存的内容作为列表保存'''
        f = open('record1.txt','r+')
        talk_ = []

        for i in f:
            if i.startswith(name):
                talk_.append(i.lstrip(name))

        f.close()
        return talk_
    save_files()
   
    pickle_file = open(file_name,'wb')
    pickle.dump(talk_,pickle_file)
    pickle_file.close()

a = save_files('boy_.txt','小甲鱼:')
最佳答案
2022-4-13 20:52:18
Victor0321 发表于 2022-4-13 20:49
好的 好的,那我这def save_files(file_name,name):输入a = save_files('boy_.txt','小甲鱼:')
这两个变 ...

可以使用,内层函数是可以使用外层函数的变量的,只是不能通过赋值的方式修改,

因为在内部函数赋值的话不做 nonlocal 、global 声明就会成了内部函数的局部变量
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-13 20:12:46 | 显示全部楼层
本帖最后由 isdkz 于 2022-4-13 20:20 编辑

因为那个是内层函数一个局部变量,外层函数是访问不到的,

想要外层函数可以访问的话,可以在外层函数定义(可变对象是可以在内层函数进行修改的),

也可以用一个变量接收返回值:

在外层函数定义变量:
def save_files(file_name,name):
    '''name必须为人名:'''
    import pickle
    talk_ = []                # 注意这里
    def save_files():
        '''将文件要保存的内容作为列表保存'''
        f = open('record1.txt','r+')

        for i in f:
            if i.startswith(name):
                talk_.append(i.lstrip(name))

        f.close()
    save_files()
   
    pickle_file = open(file_name,'wb')
    pickle.dump(talk_,pickle_file)
    pickle_file.close()

a = save_files('boy_.txt','小甲鱼:')

使用一个变量接收返回值:
def save_files(file_name,name):
    '''name必须为人名:'''
    import pickle
   
    def save_files():
        '''将文件要保存的内容作为列表保存'''
        f = open('record1.txt','r+')
        talk_ = []

        for i in f:
            if i.startswith(name):
                talk_.append(i.lstrip(name))

        f.close()
        return talk_
    takl_ = save_files()                   # 注意这里
   
    pickle_file = open(file_name,'wb')
    pickle.dump(talk_,pickle_file)
    pickle_file.close()

a = save_files('boy_.txt','小甲鱼:')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-13 20:34:01 | 显示全部楼层
isdkz 发表于 2022-4-13 20:12
因为那个是内层函数一个局部变量,外层函数是访问不到的,

想要外层函数可以访问的话,可以在外层函数定 ...

好滴,那下面这句是不是要在内层函数里加一个nonlocal talk_

def save_files(file_name,name):
    '''name必须为人名:'''
    import pickle
    talk_ = []                # 注意这里
    def save_files():
        '''将文件要保存的内容作为列表保存'''
        f = open('record1.txt','r+')

        for i in f:
            if i.startswith(name):
                talk_.append(i.lstrip(name))

        f.close()
    save_files()
   
    pickle_file = open(file_name,'wb')
    pickle.dump(talk_,pickle_file)
    pickle_file.close()

a = save_files('boy_.txt','小甲鱼:')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-13 20:39:13 | 显示全部楼层
Victor0321 发表于 2022-4-13 20:34
好滴,那下面这句是不是要在内层函数里加一个nonlocal talk_

def save_files(file_name,name):


不需要,因为在内层函数没有对列表重新赋值是可以通过 append 给外层函数的列表添加元素的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-13 20:49:44 | 显示全部楼层
isdkz 发表于 2022-4-13 20:39
不需要,因为在内层函数没有对列表重新赋值是可以通过 append 给外层函数的列表添加元素的

好的 好的,那我这def save_files(file_name,name):输入a = save_files('boy_.txt','小甲鱼:')
这两个变量无论在外层还是在内层使用这两个变量他都可以使用的吧,不会报not defined吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-13 20:52:18 | 显示全部楼层    本楼为最佳答案   
Victor0321 发表于 2022-4-13 20:49
好的 好的,那我这def save_files(file_name,name):输入a = save_files('boy_.txt','小甲鱼:')
这两个变 ...

可以使用,内层函数是可以使用外层函数的变量的,只是不能通过赋值的方式修改,

因为在内部函数赋值的话不做 nonlocal 、global 声明就会成了内部函数的局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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