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

Python跨模块访问dict显示为空报KeyError如何解决?

问题原因
  • 你的代码存在循环导入问题,执行顺序导致user_dict还没完成初始化就被File2调用了:
    1. 运行File1.py时,第一行是import file2,此时会先执行File2.py的全部顶层代码
    2. File2.py第一行是import File1,这时候又会跳回执行File1的代码,但此时File1的user_dict = {}、类定义、函数定义都还没执行到,更不用说最后一行的add_data()调用
    3. 等到File2的导入完成,回到File1执行后续代码把数据写入user_dict的时候,File2里之前拿到的File1模块还是未完成初始化的版本,自然是空字典
解决方法

方法1:调整导入位置,避免顶层循环导入

把File1.py第一行的import file2移到add_data函数内部,这样导入File2的时候,File1的user_dict已经完成初始化:
修改后的File1.py代码:

user_dict = {}

class User:
    def __init__(self, chat_id):
        self.chat_id = chat_id
        self.refer_count = None
        self.wallet = None
        self.message_id = None
        self.total_amount = None
        self.first_name = None
        self.who_invite = None
        self._id = None
        self.trnx_id = None

def add_data():
      import file2 # 把导入移到函数内部
      user = User('123')
      user.chat_id = '123'
      user.who_invite = '012'
      user.refer_count = 0
      user.total_amount = 0.0
      user.first_name = 'user'
      user_dict['123'] = user
      file2.print_chat_id()

def getUserDict(chat_id):
    return user_dict[chat_id]

add_data()

File2.py代码无需修改,直接运行File1.py就能正常输出123。

方法2:拆分公共存储到第三方模块,彻底避免循环导入

把user_dict、User类、getUserDict这类公共逻辑单独放到新文件common.py中,File1和File2都导入这个公共模块,从根源上消除循环导入:
common.py代码:

user_dict = {}

class User:
    def __init__(self, chat_id):
        self.chat_id = chat_id
        self.refer_count = None
        self.wallet = None
        self.message_id = None
        self.total_amount = None
        self.first_name = None
        self.who_invite = None
        self._id = None
        self.trnx_id = None

def getUserDict(chat_id):
    return user_dict[chat_id]

修改后的File1.py:

import file2
from common import user_dict, User

def add_data():
      user = User('123')
      user.chat_id = '123'
      user.who_invite = '012'
      user.refer_count = 0
      user.total_amount = 0.0
      user.first_name = 'user'
      user_dict['123'] = user
      file2.print_chat_id()

add_data()

修改后的File2.py:

from common import getUserDict

def print_chat_id():
  user = getUserDict('123')
  print(user.chat_id)
额外注意

不同操作系统对文件名大小写敏感程度不同,导入模块时的文件名要和实际文件名的大小写完全一致,避免出现找不到模块的额外错误。

内容的提问来源于stack exchange,提问作者Drop Guruji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:04