当前位置: 首页 > 面试题库 >

不同模块之间的全局变量

齐思淼
2023-03-14
问题内容

main.py:

from module import *   
var=10

def func2():
    print "func2:" ,var

def main():
    global var
    var=20
    print "main - before", var
    func2()
    func1()
    print "main - after", var

if __name__=='__main__':
    main()

module.py

from main import *

def func1():
    global var
    print "func1:", var

程序打印:

主要-之前:20

func2:20

func1:10

主-20点后


var”是全局变量。我希望当我更改var的值时,无论变量’var’出现在哪里,它都会被更改。func1和func2之间的唯一区别是func1在另一个模块中。仍然,我不明白为什么func1和func2之间的’var’值不同。


问题答案:

python中没有真正的全局变量。对象被绑定到命名空间中的变量,并且global关键字引用当前 模块的 命名空间。from somemodule import *在当前模块的名称空间中创建新变量,并将它们引用到 somemodule
的对象。现在,您有两个不同的变量指向同一个对象。如果您重新绑定其中一个变量,则其他变量将继续引用原始对象。此外,function.s的“全局”命名空间是在其定义的模块,即使将其导入到其他模块也是如此。

如果需要“全局”变量,请导入模块并使用其名称空间限定名称,而不是在本地名称空间中重新绑定各个变量。

这是一个带注释的示例…

cfg.py

var = 10
somelist = []
var2 = 1

def show_var2():
    print var2

main.py

import cfg
from cfg import *   # bind objects referenced by variables in cfg to
                    # like-named variables in this module. These objects
                    # from 'cfg' now have an additional reference here

if __name__ == '__main__':
    print cfg.var, var
    var = 20        # rebind this module's 'var' to some other value.
                    # this does not affect cfg's 'var'
    print cfg.var, var

    print '----'
    print cfg.somelist, somelist
    somelist.append(1)    # update this module's 'somelist'
                          # since we updated the existing object, all see it
    print cfg.somelist, somelist

    print '----'
    var2 = 2
    print var2, cfg.var2, show_var2() # show_var2 is in cfg.py and uses its
                                      # namespace even if its been imported
                                      # elsewhere


 类似资料:
  • 问题内容: 我知道可以在Python中的各个模块之间共享全局变量。但是,我想知道这种可能性的程度以及原因。例如, global_mod.py mid_access_mod.py bot_modif_mod.py 即使所有模块都共享全局变量x,也将打印“无”。为什么会这样呢?似乎x是在mew()分配给bot_modif_mod.py之前在mid_access_mod.py求值的。 问题答案: 发生这

  • 我有以下文件: 我希望这个'app'变量是全局可访问的,因为其他文件是这样使用它的: 在webpack.config.js中,我有以下一行: 我想不出我错过了什么。我的app.js格式不正确吗?为什么仍然不能全局使用?

  • 问题内容: 我知道全局变量不好。 但是,如果我在框架的40个文件中使用节点的模块“ util”,那么最好仅将其声明为全局变量,例如: 在index.js文件中,而不是在40个文件中写入该行? 因为我经常在每个文件中使用相同的5-10个模块,这样可以节省大量时间,而不是一直复制粘贴。 在这种情况下干不好吗? 问题答案: 每个模块应该是独立的。在每个模块的第一个需求之后,require都不会花费任何东

  • 本文向大家介绍局部变量和全局变量之间的差异,包括了局部变量和全局变量之间的差异的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解局部变量和全局变量之间的区别。 局部变量 通常在函数内部声明它。 如果未初始化,则将垃圾值存储在其中。 在函数开始执行时创建。 功能终止后,它将丢失。 由于可以通过单个功能访问局部变量/数据,因此无法进行数据共享。 需要将参数传递给局部变量,以便它们可以访问函

  • 问题内容: 我有一个似乎很基本的问题,但我似乎在任何地方都找不到任何帮助。 XYZ.doSomething()无法说出NameError:未定义名称“ XYZ”即使从file_a完成的标准导入(如“ import sys”)似乎也无法使其在file_b中可用。我以为应该工作。我的理解错了吗?如果是,那么是否有办法在文件之间具有通用的导入和全局变量?(如果没有帮助,我曾经是C ++和Java程序员,

  • 问题内容: 我遇到了一些在Python脚本中导入模块的问题。我将尽力描述错误,为什么会遇到错误以及为什么要使用这种特殊方法来解决我的问题(我将在稍后描述): 假设我有一个模块,其中定义了一些实用程序函数/类,这些函数/类引用在此辅助模块将导入到的命名空间中定义的实体(让“ a”成为这样的实体): 模块1: 然后,我有了主程序,其中定义了“ a”,我要将这些实用程序导入其中: 执行该程序将触发以下错