python3-不使用更新的全局变量值,而是使用旧值

时间:2018-06-25 14:27:52

标签: python python-3.x

我是python的新手,尝试在导入的模块中更新变量x,然后尝试在其他变量y中使用更新后的变量x,但是y使用x的旧值代替了新值值。请帮助提供一些指示,以使其正常工作!

我的意图是使用py文件列出所有可以在其他py文件中使用的全局变量。我可以更新并使用全局变量,但不确定如何在其他变量中使用更新后的全局变量。

示例代码:

a.py:

var1 = 0
var2 = var1 + 1

b.py:

import a

def update_var():
    a.var1 = 10
    print("Updated var1 is {}".format(a.var1))
    print("var2 is {}".format(a.var2))

if __name__ == "__main__":
    update_var()

输出:

Updated var1 is 10
var2 is 1

预期输出:

由于我将var1更新为10,因此我希望在var2中使用更新后的值

Updated var1 is 10
var2 is 11

3 个答案:

答案 0 :(得分:3)

Python不能那样工作。 import模块时,将执行模块中的代码。在您的情况下,这意味着定义了两个变量:值为a.var1的{​​{1}}和值为0的{​​{1}}。如果您随后修改a.var2,将不会影响1,它的值是在导入模块时定义的,除非明确更改,否则它不会更改。

答案 1 :(得分:1)

这是由于var2在导入时仅初始化了一次。 解决此问题的方法是编写一个getter或和update函数。


可能的吸气功能为:

a.py

var1 = 0
var2 = var1 + 1

def getVar2():
    return var1 + 1

b.py:

import a

def update_var():
    a.var1 = 10
    print("Updated var1 is {}".format(a.var1))
    print("var2 is {}".format(a.getVar2()))

if __name__ == "__main__":
    update_var()

可能的更新功能为:

a.py

var1 = 0
var2 = var1 + 1

def updateVar2():
    var2 = var1+1

b.py:

import a

def update_var():
    a.var1 = 10
    a.updateVar2()
    print("Updated var1 is {}".format(a.var1))
    print("var2 is {}".format(a.var2()))

if __name__ == "__main__":
    update_var()

答案 2 :(得分:0)

根据@GPhilo的输入和我的个人经验,我想出了以下可行的解决方案,猜测解决方案2更具Pythonic性。

解决方案1:

a.py:

class Globals:

def __init__(self, value):
    self.var1 = value
    self.var2 = self.var1 + 1

b.py:

from a import Globals

def update_var():
    globals_instance = Globals(10)
    print("Updated var1 is {}".format(globals_instance.var1))
    print("var2 is {}".format(globals_instance.var2))


if __name__ == "__main__":
    update_var()

输出:

Updated var1 is 10
var2 is 11

解决方案2:

按如下所示更改a.py的实现”

a.py:

class Globals:

    def __init__(self, value):
        self._var1 = value
        self.var2 = self._var1 + 1


    @property
    def var1(self):
        return self._var1


    @var1.setter
    def var1(self, value):
        self._var1 = value