鱼C论坛

 找回密码
 立即注册
查看: 1069|回复: 9

[已解决]定义函数的时候是可以用局外变量的吧?

[复制链接]
发表于 2022-3-6 13:43:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 小丑9 于 2022-3-6 13:44 编辑
import pickle


def size_file(n):
    a = 'boy' + str(n) + '.txt'
    b = 'girl' + str(n) + '.txt'
    f1 = open(a,'wb')
    pickle.dump(boy_list,f1)
    f1.close()
    f2 = open(b,'wb')
    pickle.dump(girl_list,f2)
    f2.close()


def search_file(name_file):
    boy_list = []
    girl_list = []
    n = 0
    file = open(name_file)
    for each_line in file:
        if each_line[:3] == '===':
            n += 1
            size_file( n)
            boy_list.clear()
            girl_list.clear()
        who_line = each_line.split(':',1)
        if who_line[0] == '小甲鱼':
            boy_list.append(who_line[1])
        elif who_line[0] == '小客服':
            girl_list.append(who_line[1])
    file.close()

search_file('record.txt')


我在定义 search_file 函数的时候已经定义了 boy_list 和 giel_list 变量,可我在定义size_file 函数的时候在8行和11行为什么不能调用这两个变量?它显示这两个变量没有被定义。
如果给size_file加入这两个形参的话就可以运行,按道理来说定义函数的时候是可以用局外变量的吧?
最佳答案
2022-3-6 13:57:57
在函数里面定义变量只能在局部使用,你想定义全局变量的话得加个 global 声明。
import pickle


def size_file(n):
    a = 'boy' + str(n) + '.txt'
    b = 'girl' + str(n) + '.txt'
    f1 = open(a,'wb')
    pickle.dump(boy_list,f1)
    f1.close()
    f2 = open(b,'wb')
    pickle.dump(girl_list,f2)
    f2.close()


def search_file(name_file):
    global boy_list, girl_list         # 加上这行
    boy_list = []
    girl_list = []
    n = 0
    file = open(name_file)
    for each_line in file:
        if each_line[:3] == '===':
            n += 1
            size_file( n)
            boy_list.clear()
            girl_list.clear()
        who_line = each_line.split(':',1)
        if who_line[0] == '小甲鱼':
            boy_list.append(who_line[1])
        elif who_line[0] == '小客服':
            girl_list.append(who_line[1])
    file.close()

search_file('record.txt')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-6 13:52:12 | 显示全部楼层
因为你如果在还没调用 search_file 函数之前,全局变量 boy_list 和 girl_list 还没有被生成,所以会报错,
函数内引用外部全局变量是可以的,但不能修改!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 13:52:47 | 显示全部楼层
所以您要单独调试的话就必须手动传入参数测试啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 13:57:57 | 显示全部楼层    本楼为最佳答案   
在函数里面定义变量只能在局部使用,你想定义全局变量的话得加个 global 声明。
import pickle


def size_file(n):
    a = 'boy' + str(n) + '.txt'
    b = 'girl' + str(n) + '.txt'
    f1 = open(a,'wb')
    pickle.dump(boy_list,f1)
    f1.close()
    f2 = open(b,'wb')
    pickle.dump(girl_list,f2)
    f2.close()


def search_file(name_file):
    global boy_list, girl_list         # 加上这行
    boy_list = []
    girl_list = []
    n = 0
    file = open(name_file)
    for each_line in file:
        if each_line[:3] == '===':
            n += 1
            size_file( n)
            boy_list.clear()
            girl_list.clear()
        who_line = each_line.split(':',1)
        if who_line[0] == '小甲鱼':
            boy_list.append(who_line[1])
        elif who_line[0] == '小客服':
            girl_list.append(who_line[1])
    file.close()

search_file('record.txt')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 14:01:20 | 显示全部楼层
python爱好者. 发表于 2022-3-6 13:52
因为你如果在还没调用 search_file 函数之前,全局变量 boy_list 和 girl_list 还没有被生成,所以会报错, ...

就是说如果我把那两个变量在函数外面定义而不是在函数里面就可以不添加形参了吗,即便在size_file生效前就有了这两个变量,还是说即便size_file在search_file里面,在调用search_file的时候这两个函数就同时生效了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 14:04:22 | 显示全部楼层
isdkz 发表于 2022-3-6 13:57
在函数里面定义变量只能在局部使用,你想定义全局变量的话得加个 global 声明。

但是内嵌函数也是可以用外部作用域的变量的吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 14:07:19 | 显示全部楼层
小丑9 发表于 2022-3-6 14:04
但是内嵌函数也是可以用外部作用域的变量的吧?


可以用,不过你那个不是内嵌函数,有没有内嵌是看它定义的时候的,而不是使用的时候。

这样就内嵌了
import pickle


def search_file(name_file):
    boy_list = []
    girl_list = []
    def size_file(n):
        a = 'boy' + str(n) + '.txt'
        b = 'girl' + str(n) + '.txt'
        f1 = open(a,'wb')
        pickle.dump(boy_list,f1)
        f1.close()
        f2 = open(b,'wb')
        pickle.dump(girl_list,f2)
        f2.close()
    n = 0
    file = open(name_file)
    for each_line in file:
        if each_line[:3] == '===':
            n += 1
            size_file( n)
            boy_list.clear()
            girl_list.clear()
        who_line = each_line.split(':',1)
        if who_line[0] == '小甲鱼':
            boy_list.append(who_line[1])
        elif who_line[0] == '小客服':
            girl_list.append(who_line[1])
    file.close()

search_file('record.txt')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 14:12:15 | 显示全部楼层
isdkz 发表于 2022-3-6 14:07
可以用,不过你那个不是内嵌函数,有没有内嵌是看它定义的时候的,而不是使用的时候。

这样就内嵌了 ...

说错了,不是内嵌,,,就是说如果是单独定义的两个函数的话,里面的变量是需要都定义的是吗,那size_file调用的是不是就是全局变量?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 14:13:11 | 显示全部楼层
小丑9 发表于 2022-3-6 14:12
说错了,不是内嵌,,,就是说如果是单独定义的两个函数的话,里面的变量是需要都定义的是吗,那size_fil ...

对的,因为它没有外部函数,它在自己的作用域找不到,就直接找全局了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 14:14:16 | 显示全部楼层
isdkz 发表于 2022-3-6 14:13
对的,因为它没有外部函数,它在自己的作用域找不到,就直接找全局了。

非常感谢,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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