You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:02