我有两个模块:
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
为什么?我错过了什么?我可以修复它以获得预期的结果吗?
答案 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 *
个名称WIDTH
,HEIGHT
,LINE_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