项目场景:
一个简单的本地学生信息管理系统, 使用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关键字的 局限性有关,但是还没有学习到这个知识点
解决方案:
下面分享两种解决方案
方案1
方法: 使用全大写字母代替小写字母的全局遍量
原理: 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))
问题: 代码需要改变常量这不好!
方案2 (推荐)
方法: 使用函数的参数, 以传值的方式引入变量
原理: 利用函数的形参等参数传值将要保存的数据传递给方法体, 跨过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)
问题:给全局遍量传值,稍微有点傻…