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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:23:20