一个简单的本地学生信息管理系统, 使用python的json模块将学生信息数据保存到本地
在 储学生信息 到本地的时候需要将全局变量引入save_user 函数体内,但是引入没有起效果,全局遍量students为[]
但是在问题函数下面一个函数 load_users 内就可以引入成功
global students
# 存储学生信息 def save_user(): global students print(students) # [] with open(FILE_PATH, 'w', encoding='utf-8') as file: # ensure_ascii=False 这个设置的是在json文件中显示汉字不是以unicode编码形式显示的 而是汉字本身 json.dump(STUDENTS, file, ensure_ascii=False) # file.write(json.dumps(students, indent=4)) # 加载学生信息 def load_users(): global students # [{'aa':112,'asa':ass},{},{}] # 文件不存在 或者 文件存在 但是没有数据 就表示没有存储过 if not os.path.exists(FILE_PATH) or os.path.getsize(FILE_PATH) == 0: students = [] else: with open(FILE_PATH, 'r', encoding='utf-8') as file: students = json.load(file) # 之前有存储 字典得赋予原来注册的那些用户
有图有真相:
经过几个小时查找资料, 我未找到具体因为什么,据说跟global关键字的 局限性有关,但是还没有学习到这个知识点
下面分享两种解决方案
方法: 使用全大写字母代替小写字母的全局遍量
原理: python中 称变量名英文字母全部是大写的 这种格式的数据成为常量 就不允许变化了, 而常量是默认导入全部函数内,跨过global问题
import json # python中 称变量名英文字母全部是大写的 这种格式的数据成为常量 就不允许变化了 STUDENTS = [] # 存储学生信息 def save_user(): with open(FILE_PATH, 'w', encoding='utf-8') as file: # ensure_ascii=False 这个设置的是在json文件中显示汉字不是以unicode编码形式显示的 而是汉字本身 json.dump(STUDENTS, file, ensure_ascii=False) # file.write(json.dumps(students, indent=4))
问题: 代码需要改变常量这不好!
方法: 使用函数的参数, 以传值的方式引入变量
原理: 利用函数的形参等参数传值将要保存的数据传递给方法体, 跨过global的问题, 最简单而有效也安全
# 存储学生信息 def save_user(student_list): # global students 大写就可以全局,小写就不可以全局,下面都可以全局,这里就是为[],????? with open(FILE_PATH, 'w', encoding='utf-8') as file: # ensure_ascii=False 这个设置的是在json文件中显示汉字不是以unicode编码形式显示的 而是汉字本身 json.dump(student_list, file, ensure_ascii=False) # file.write(json.dumps(students, indent=4)) save_user(students)
问题:给全局遍量传值,稍微有点傻…