Socket石头剪刀布游戏中JSON字典被隐式修改问题求助
问题原因:Python可变对象的引用传递
你的问题核心是Python中可变对象的引用传递特性——字典属于可变对象,赋值操作不会创建新的对象副本,只会让新变量指向原对象的内存地址。
具体分析
在你的代码中:
blank_request_jdict = json.loads(requests_jstring) request_jdict = blank_request_jdict
这两行代码并没有生成两个独立的字典。request_jdict只是blank_request_jdict的一个引用,二者指向内存中同一个字典对象。后续调用request_packer函数修改request_jdict的内容时,本质上是直接修改了这个共享的字典对象,所以blank_request_jdict的内容也会被同步改变——哪怕代码里没有直接操作blank_request_jdict。
解决方案
因为你的字典是嵌套结构(包含子字典),需要使用深拷贝来创建完全独立的副本,避免原对象被意外修改。具体有两种常用方式:
1. 使用copy模块的deepcopy
import json import copy # 导入copy模块 requests_jstring = """{ "request":{ "null_request": { "active":0 }, "setup_new_room": { "active":0 }, "pick": { "active":0, "option":"rock" }, "resign": { "active":0 }, "join_existing_room": { "active":0, "roomID": 0 } } }""" blank_request_jdict = json.loads(requests_jstring) request_jdict = copy.deepcopy(blank_request_jdict) # 深拷贝创建独立副本
2. 每次重新解析JSON字符串
如果不需要保留动态修改后的blank_request_jdict,也可以每次需要空白请求时直接重新解析原始JSON字符串,生成全新的字典:
request_jdict = json.loads(requests_jstring)
两种方式都能确保request_jdict的修改不会影响到blank_request_jdict,解决你的隐式修改问题。
内容的提问来源于stack exchange,提问作者Doggoluvr
相关产品推荐
相关产品推荐

