Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不同包中的模块之间使用python中的全局变量_Python_Python 2.7_Global Variables - Fatal编程技术网

在不同包中的模块之间使用python中的全局变量

在不同包中的模块之间使用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

我是Python新手,正在尝试在不同包的不同模块中使用包中模块的全局计数器。我想做的是在一个模块中声明一个变量,然后将它导入到不同包中的其他模块中。我对这个问题做了一个简单的测试,它也在这里发生。我将所有文件放在同一个目录中(它们现在在同一个包中,但问题是相同的)

文件glbcntmod.py:

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
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”时,它意味着“使用导入的全局值”