在不同包中的模块之间使用python中的全局变量
我是Python新手,正在尝试在不同包的不同模块中使用包中模块的全局计数器。我想做的是在一个模块中声明一个变量,然后将它导入到不同包中的其他模块中。我对这个问题做了一个简单的测试,它也在这里发生。我将所有文件放在同一个目录中(它们现在在同一个包中,但问题是相同的) 文件glbcntmod.py:在不同包中的模块之间使用python中的全局变量,python,python-2.7,global-variables,Python,Python 2.7,Global Variables,我是Python新手,正在尝试在不同包的不同模块中使用包中模块的全局计数器。我想做的是在一个模块中声明一个变量,然后将它导入到不同包中的其他模块中。我对这个问题做了一个简单的测试,它也在这里发生。我将所有文件放在同一个目录中(它们现在在同一个包中,但问题是相同的) 文件glbcntmod.py: glbcnt = 0 from glbcntmod import glbcnt def glbfunc(): global glbcnt print 'glbcnt = ',glbcn
glbcnt = 0
from glbcntmod import glbcnt
def glbfunc():
global glbcnt
print 'glbcnt = ',glbcnt
文件glbfuncmod.py:
glbcnt = 0
from glbcntmod import glbcnt
def glbfunc():
global glbcnt
print 'glbcnt = ',glbcnt
文件:test.py
#!/usr/bin/env python
from glbcntmod import glbcnt
from glbfuncmod import glbfunc
loccnt = 0
def localfunc():
print 'loccnt = ',loccnt
if __name__ == '__main__':
glbcnt = 0
for i in xrange(0,4):
glbfunc()
localfunc()
glbcnt += 1
loccnt += 1
当我运行test.py时,结果如下所示。loccnt正在递增,但glbcnt始终为0。有什么问题
glbcnt = 0
loccnt = 0
glbcnt = 0
loccnt = 1
glbcnt = 0
loccnt = 2
glbcnt = 0
loccnt = 3
如果您试图从另一个模块更新全局变量,请勾选此答案:如果您试图从另一个模块更新全局变量,请勾选此答案:在test.py中:
if __name__ == '__main__':
glbcnt = 0
for i in xrange(0,4):
...
glbcnt += 1
在这里创建一个局部glbcnt变量,它是一个递增的变量。您的glbfunc()没有看到此变量,因此无法打印其值
试试这个:
if __name__ == '__main__':
global glbcnt
glbcnt = 0
...
此外,正因为如此,整个glbcntmod.py文件变得毫无意义
这并不是因为一个变量被声明为全局变量一次,而是因为它在任何地方都是全局的
“全局glbcnt”只是指从此处开始,在此范围内,对glbcnt的任何引用都将引用全局变量。任何影响都不会应用于其他范围,即其他模块。在test.py中:
if __name__ == '__main__':
glbcnt = 0
for i in xrange(0,4):
...
glbcnt += 1
在这里创建一个局部glbcnt变量,它是一个递增的变量。您的glbfunc()没有看到此变量,因此无法打印其值
试试这个:
if __name__ == '__main__':
global glbcnt
glbcnt = 0
...
此外,正因为如此,整个glbcntmod.py文件变得毫无意义
这并不是因为一个变量被声明为全局变量一次,而是因为它在任何地方都是全局的
“全局glbcnt”只是指从此处开始,在此范围内,对glbcnt的任何引用都将引用全局变量。任何影响都不会应用于其他作用域,即其他模块。实现此目的的方法是将模块保持在变量作为参考的位置:
import other_module
other_module.counter += 1
如果您在使用计数器的任何地方都这样做,它将在模块之间具有一致的值
这是因为每次在Python中对名称进行赋值时,与该名称关联的对象都会发生更改-
也就是说,如果你这样做了
from othermodule import counter
counter = 1
您的计数器
变量将指向与上的赋值不同的对象。由于数字是不可变的对象,因此这方面甚至还有其他问题
但是,如果保留原始模块,您将更改该模块对象中的一个属性,该属性的行为与任何其他Python对象完全相同。只要其他代码将变量作为模块的属性访问,您就可以了。这样做的方法是将模块保留在变量作为引用的位置:
import other_module
other_module.counter += 1
如果您在使用计数器的任何地方都这样做,它将在模块之间具有一致的值
这是因为每次在Python中对名称进行赋值时,与该名称关联的对象都会发生更改-
也就是说,如果你这样做了
from othermodule import counter
counter = 1
您的计数器
变量将指向与上的赋值不同的对象。由于数字是不可变的对象,因此这方面甚至还有其他问题
但是,如果保留原始模块,您将更改该模块对象中的一个属性,该属性的行为与任何其他Python对象完全相同。只要其他代码将变量作为模块的属性访问,就可以了。请注意,int
在python中是不可变的。这意味着做一些类似的事情
a = 0
b = a # b = 0
b += 1 # b = 2
仍将a
保留为0
当您从glbcntmod导入glbcnt时,这基本上等于
import glbcntmod
glbcnt = glbcntmod.glbcnt
因此,如果随后递增glbcnt
,则只有本地名称将被分配新值。原始的glbcnt
未更改
如果要使用全局变量,必须使用其全局名称。因此,您想要使用和修改的是glbcntmod.glbcnt
注意,int
在python中是不可变的。这意味着做一些类似的事情
a = 0
b = a # b = 0
b += 1 # b = 2
仍将a
保留为0
当您从glbcntmod导入glbcnt时,这基本上等于
import glbcntmod
glbcnt = glbcntmod.glbcnt
因此,如果随后递增glbcnt
,则只有本地名称将被分配新值。原始的glbcnt
未更改
如果要使用全局变量,必须使用其全局名称。因此,您想要使用和修改的是glbcntmod.glbcnt
为什么你在Test.Py中有<代码> GLBCNT=0 < /代码>?你可以考虑使用分布式密钥/值存储La Read。@ Purku只是一个错误。如果我删除它,它是一样的。为什么你在Test.Py中有<代码> GLBCNT=0 < /Cord>?你可以考虑使用分布式密钥/值存储La Read。@ Purku只是一个错误。如果我删除它,它是一样的。你似乎是对的,但当我在main中添加'global globcnt'时,它是一样的..奇怪。。当然,我也从main中删除了'glbcnt=0'。嗨,现在我从bueno的回复中理解了它。另外,在分配给glbcnt之前,我最初在每个函数中使用“全局glbcnt”,但问题是当我从模块导入变量时,它是从“全局值”导入的,当我在函数中声明“全局glbcnt”时,它意味着“使用导入的全局值glbcnt(但它仍然是本地的)。所以在这种情况下,我应该使用import module.variable格式。这就是我的理解。你似乎是对的,但当我在主体中添加“global globcnt”时,它是一样的..奇怪。。当然,我也从main中删除了'glbcnt=0'。嗨,现在我从bueno的回复中理解了它。另外,在分配给glbcnt之前,我最初在每个函数中使用“全局glbcnt”,但问题是当我从模块导入变量时,它是从“全局值”导入的,当我在函数中声明“全局glbcnt”时,它意味着“使用导入的全局值”