为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的模块的行为不像单例?

为什么我的模块的行为不像单例?

jeck猫 2022-12-27 09:58:28
我有一个 JSON 文件,我在一个小游戏中将其用作数据存储,我将其用作学习 Python 的一种方式。我精通许多其他语言。我有几个类想要对 JSON 进行读取访问,所以我想将文件中的 JSON 加载到一个变量中,然后允许其他类通过 getter 和 setter 访问该变量,因为每个类都需要 JSON 的不同部分。这听起来像是单身人士的工作。我知道 Python 模块的行为就像一个单例。但是,当我将模块导入我的类时,变量会重置吗?这是一个非常精简的例子:模块:- state_managerx=45def set_x(value):    x=valuedef get_x():    return x类:- 游戏import Playerimport state_managervalue = state_manager.get_x()班级:- 球员import state_managerstate_manager.set_x(12)通过设置断点,我可以看到当 Player 被 Game 导入时将inPlayer的值设置为 12。xstate_manager但是当我查看x返回到 Game的值时,state_manager.get_x()我得到了 45。为什么是这样?在 Python 中创建可以在其他类之间共享的模块或对象的正确方法是什么?我意识到我可以自己构造一个 Singleton,但我想我会使用 Python 的特性。
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

通过设置断点,我可以看到当 Player 被 Game 导入时,Player 将 state_manager 中的 x 值设置为 12。


我相当确定你在检查中做错了什么,因为这个set_x功能,至少在你引用它的时候......


x=45

def set_x(value):

    x=value

...不做你认为它做的事。由于x在 的范围内被赋值set_x,它不是指全局(模块级)变量,而是指返回时作为堆栈帧的一部分立即丢弃x的局部变量。静态赋值的存在实际上是局部变量在 Python 中的声明方式。解决方法是声明为引用全局变量:xset_xx


x=45

def set_x(value):

    global x

    x=value


查看完整回答
反对 回复 2022-12-27
?
墨色风雨

TA贡献1853条经验 获得超6个赞

您需要x在任何试图全局设置它的函数中声明全局:

def set_x(value):
    global x
    x=value

没有全局声明,x只是一个函数局部变量。

通常,如果一个函数在函数中的任何地方赋值给一个变量,那么该变量就是局部变量,除非它被显式声明global(或nonlocal)。如果一个函数只读取一个变量,而不设置它,那么这个变量是从一个更高的范围(例如,一个全局的,或一个上层引用)中获取的。


查看完整回答
反对 回复 2022-12-27
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信