定义函数的时候是可以用局外变量的吧?
本帖最后由 小丑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 == '小甲鱼':
boy_list.append(who_line)
elif who_line == '小客服':
girl_list.append(who_line)
file.close()
search_file('record.txt')
我在定义 search_file 函数的时候已经定义了 boy_list 和 giel_list 变量,可我在定义size_file 函数的时候在8行和11行为什么不能调用这两个变量?它显示这两个变量没有被定义。
如果给size_file加入这两个形参的话就可以运行,按道理来说定义函数的时候是可以用局外变量的吧? 因为你如果在还没调用 search_file 函数之前,全局变量 boy_list 和 girl_list 还没有被生成,所以会报错,
函数内引用外部全局变量是可以的,但不能修改! 所以您要单独调试的话就必须手动传入参数测试啦! 在函数里面定义变量只能在局部使用,你想定义全局变量的话得加个 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 == '小甲鱼':
boy_list.append(who_line)
elif who_line == '小客服':
girl_list.append(who_line)
file.close()
search_file('record.txt')
python爱好者. 发表于 2022-3-6 13:52
因为你如果在还没调用 search_file 函数之前,全局变量 boy_list 和 girl_list 还没有被生成,所以会报错, ...
就是说如果我把那两个变量在函数外面定义而不是在函数里面就可以不添加形参了吗,即便在size_file生效前就有了这两个变量,还是说即便size_file在search_file里面,在调用search_file的时候这两个函数就同时生效了 isdkz 发表于 2022-3-6 13:57
在函数里面定义变量只能在局部使用,你想定义全局变量的话得加个 global 声明。
但是内嵌函数也是可以用外部作用域的变量的吧? 小丑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 == '小甲鱼':
boy_list.append(who_line)
elif who_line == '小客服':
girl_list.append(who_line)
file.close()
search_file('record.txt')
isdkz 发表于 2022-3-6 14:07
可以用,不过你那个不是内嵌函数,有没有内嵌是看它定义的时候的,而不是使用的时候。
这样就内嵌了 ...
说错了,不是内嵌,,,就是说如果是单独定义的两个函数的话,里面的变量是需要都定义的是吗,那size_file调用的是不是就是全局变量? 小丑9 发表于 2022-3-6 14:12
说错了,不是内嵌,,,就是说如果是单独定义的两个函数的话,里面的变量是需要都定义的是吗,那size_fil ...
对的,因为它没有外部函数,它在自己的作用域找不到,就直接找全局了。 isdkz 发表于 2022-3-6 14:13
对的,因为它没有外部函数,它在自己的作用域找不到,就直接找全局了。
非常感谢,明白了
页:
[1]