Python中对JSON取值赋值的变量使用+=运算符不生效问题
问题原因
这个报错是Python的变量作用域规则导致的:
- 当你在函数内部对int这类不可变类型做
+=这类赋值操作时,Python默认会将该变量识别为当前函数的局部变量,如果你没有在函数内部先定义它,就会触发未定义的报错。 - 你之前能正常运行的场景对应原因:
- 直接修改
data['valueOne']:data是字典(可变类型),修改键值不属于对data本身的赋值操作,Python会自动在外层作用域查找data变量,不会判定为局部变量 - 仅读取变量值:只读操作不会触发局部变量判定,Python会自动到外层作用域查找对应变量
- 代码不写在函数内:所有变量处于同一作用域,不存在跨作用域访问问题
- 直接修改
另外注意你原有代码还有隐藏问题:就算修复了变量未定义的报错,你修改的只是独立变量x,没有同步更新到data字典,最终写入JSON文件和打印出来的还是原来的10,不会变成11。
解决方案
方案1:用nonlocal声明外层变量
如果要保留单独定义x的写法,需要在函数内部用nonlocal关键字声明x来自外层作用域,同时同步更新data字典的值:
import json with open('testprog.json', 'r+') as f: data = json.load(f) x = int(data['valueOne']) def test(): nonlocal x x += 1 data['valueOne'] = x # 同步更新到data字典 f.seek(0) json.dump(data, f, indent=4) f.truncate() test() print("New first value is: "+str(data['valueOne']))
方案2:直接操作字典字段(更推荐)
不需要额外定义变量x,直接修改data里的对应字段,既不会有作用域问题,代码也更简洁:
import json with open('testprog.json', 'r+') as f: data = json.load(f) def test(): data['valueOne'] += 1 f.seek(0) json.dump(data, f, indent=4) f.truncate() test() print("New first value is: "+str(data['valueOne']))
内容的提问来源于stack exchange,提问作者CalBunker
相关产品推荐
相关产品推荐

