Python加载JSON时为何需要使用**运算符?
为什么实例化Tournament类时要用**运算符加载JSON数据?
相关代码示例
t1 = Tournament("Aeroflot Open", 2010) json_data = json.dumps(t1.__dict__) print(json_data) t = Tournament(**json.loads(json_data)) # <------------------- print(f"name = {t.name}, year = {t.year}")
先拆解你的代码逻辑:
- 你通过
t1.__dict__拿到了存储Tournament对象属性的字典,转成JSON字符串后,再用json.loads转回来,得到的还是一个Python字典,比如这里是{"name": "Aeroflot Open", "year": 2010}。
为什么必须用**?原因很直接:
如果直接把这个字典传给Tournament(),比如Tournament(json.loads(json_data)),相当于你把整个字典作为单个位置参数传给了类的构造方法,但Tournament的构造方法需要的是name和year这两个独立参数,这样传参会直接报错——参数数量不匹配。
而**是Python里的字典拆包运算符,它能把字典里的键值对拆解成一个个关键字参数。比如**{"name": "Aeroflot Open", "year": 2010}会被自动转换成name="Aeroflot Open", year=2010,这样传给Tournament()就正好匹配构造方法的参数要求,能正确创建出和t1属性一致的实例。
直白点说:
- 错误传参:
Tournament(字典)→ 给构造方法塞了1个参数(整个字典) - 正确传参:
Tournament(**字典)→ 给构造方法塞了2个关键字参数,和创建t1时的传参逻辑一致
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

