Victor0321 发表于 2022-4-13 19:56:57

嵌套函数

想请教下大神为什么我这个内嵌函数的返回的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','小甲鱼:')

isdkz 发表于 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','小甲鱼:')

Victor0321 发表于 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','小甲鱼:')

isdkz 发表于 2022-4-13 20:39:13

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

def save_files(file_name,name):


不需要,因为在内层函数没有对列表重新赋值是可以通过 append 给外层函数的列表添加元素的

Victor0321 发表于 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吧

isdkz 发表于 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 声明就会成了内部函数的局部变量
页: [1]
查看完整版本: 嵌套函数