python3.8 json.dump 写不进文件--global关键字失效

项目场景:

一个简单的本地学生信息管理系统, 使用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)  # 之前有存储 字典得赋予原来注册的那些用户

有图有真相:
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效
python3.8 json.dump 写不进文件--global关键字失效


原因分析:

经过几个小时查找资料, 我未找到具体因为什么,据说跟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)

问题:给全局遍量传值,稍微有点傻…

上一篇:java操作Jacoco合并dump文件


下一篇:[PHP] PHP浮点数float的另一个问题