覆盖全局变量

时间:2015-03-27 12:24:40

标签: python

我有两个模块:

constants.py

def define_sizes(supersample):    
    global SUPERSAMPLE
    global WIDTH
    global HEIGHT
    global LINE_WIDTH

    SUPERSAMPLE = supersample
    WIDTH = 1280*SUPERSAMPLE
    HEIGHT = 854*SUPERSAMPLE
    LINE_WIDTH = 1*SUPERSAMPLE

define_sizes(1)

test.py

from constants import *


print(WIDTH, HEIGHT, LINE_WIDTH)
# Draw something

define_sizes(4)

print(WIDTH, HEIGHT, LINE_WIDTH)
# Draw the same thing, but bigger

结果是:

1280 854 1
1280 854 1

我希望得到:

1280 854 1
5120 3416 4

为什么?我错过了什么?我可以修复它以获得预期的结果吗?

4 个答案:

答案 0 :(得分:1)

您不能在Python中跨模块共享全局变量。您可以使用配置模块,通过在项目中的任何需要的位置导入它,因为只有一个实例,您可以将其用作全局。它在documentation中描述。

答案 1 :(得分:1)

我推荐类似于adarsh的回答"真正的代码",但如果您需要做的只是尽可能快地破解现有代码,您可以尝试重新导入常量, test.py喜欢:

from constants import *

print(WIDTH, HEIGHT, LINE_WIDTH)

define_sizes(4)

from constants import *

print(WIDTH, HEIGHT, LINE_WIDTH)

您还必须修改constants.py,以便在重新导入时不会将SUPERSAMPLE重置为1,例如:

def define_sizes(supersample):
    global SUPERSAMPLE
    global WIDTH
    global HEIGHT
    global LINE_WIDTH

    SUPERSAMPLE = supersample
    WIDTH = 1280*SUPERSAMPLE
    HEIGHT = 854*SUPERSAMPLE
    LINE_WIDTH = 1*SUPERSAMPLE

if not 'SUPERSAMPLE' in globals():
    define_sizes(1)

答案 2 :(得分:1)

在这种情况下,我可能会做

class Sizes(object):
    def __init__(self, supersample=1)
        self.SUPERSAMPLE = supersample
    def resize(self, supersample)
        self.SUPERSAMPLE = supersample
    @property
    def WIDTH(self): return 1280*self.SUPERSAMPLE
    @property
    def HEIGHT(self): return 854*self.SUPERSAMPLE
    @property
    def LINE_WIDTH(self): return self.SUPERSAMPLE

sizes = Sizes(1)
resize = sizes.resize

然后我可以使用

from constants import sizes as s

print(s.WIDTH, s.HEIGHT, s.LINE_WIDTH)
# Draw something

s.resize(4)

print(s.WIDTH, s.HEIGHT, s.LINE_WIDTH)
# Draw the same thing, but bigger

答案 3 :(得分:1)

from constants import *个名称WIDTHHEIGHTLINE_WIDTH导入此模块的命名空间后,它们会引用他们拥有的值(对象)在进口时。

即使constants.WIDTH被覆盖,变量test.WIDTH仍会引用旧值。

最干净的解决方案是通过constants模块访问这些值:

import constants


print(constants.WIDTH, constants.HEIGHT, constants.LINE_WIDTH)
# Draw something

define_sizes(4)

print(constants.WIDTH, constants.HEIGHT, constants.LINE_WIDTH)
# Draw the same thing, but bigger