python 全局变量当发生文件嵌套时,是怎么保存的?

jeff_
  • 41

首先对python的内存模型不是很了解~

因为自动化测试框架有一个主要的main.py 里面实现了各个函数定义,然后每个不同入参的自动化用例调用main.py里面的函数实现。

但是最近有个问题在于新增加了一个Mode,也就多了一个if分支,但是我不想在每个自动化用例的入参接口增加(因为自动化用例太多了),计划是在main()里面加一个flag,然后在函数定义的里面加if分支。

image.png

我的初步想法是写一个 全局变量, 针对不同的mode,main()函数有不同的Flag,但是我发现在main.py 里面调用 test1.py ,然后 test1.py 调用 main.py 的函数定义时, 这个全局变量变得不受掌控了。

我查了点资料只是说不同py有自己的全局变量,但是我不是很清楚,这个全局变量我也不是传递到另一个.py啊,只是在A调用B,回到A。

我自己简单做了点实验发现test.py调用main.py中定义的函数时,全局gnum在A中函数func()是修改成功了,但是回到A的main()时,这个变量又变成了初始值0,不太懂py虚拟机这个内存时咋存储的。

类似于:

# -*- coding: utf-8 -*-
# main.py
gnum = 0

def  SetNumber(number):
    global gnum
    gnum = number
    print ("SetNumber: ")
    print (gnum)
    
    
def  GetNumber():
    print ("GetNumber: ")
    print (gnum)
    return gnum
    
def func():
    print ("func: ")
    print (gnum)

#    gnum = GetNumber()
#    print (gnum)
#    print ("tfunc end: ")
#    gnum = GetNumber()
#    print (gnum)

    
if __name__ == "__main__":
#   global gnum
    gnum = 1
    
    from test import tfunc
    tfunc()
    print (gnum)
    
# -*- coding: utf-8 -*-
# test.py

def tfunc():
#    num = 3
#    print ("tfunc start: " )
#    from main import SetNumber
#    SetNumber(num)

    from main import func
    func()

回复
阅读 255
2 个回答
✓ 已被采纳

由于作用域的影响,A导入的main.x和main自己内部的x未必是同一个对象。要尽量避免文件循环导入。

方法一,单独文件中定义一个可变变量,比如字典。
其他的py文件都从这里导入,这样就会共享一个变量。对字典的改写不会造成问题。

方法二,你这种需求更好的做法就是,定义一个单例类。
单例类的特点,不论你在什么地方进行实例化,“只会”返回第一次创建的实例对象。

test.py的tfunc()中操作的是同名局部变量,并非main中的global变量
因此,main中的gnum在tfunc()执行前后都不受影响

原因是:
The import statement combines two operations; it searches for the named module, then it binds the results of that search to a name in the local scope.

参考 import
关于作用域可以参考
python-scopes-and-namespaces

你知道吗?

宣传栏