python 全局变量当发生文件嵌套时,是怎么保存的?
首先对python的内存模型不是很了解~
因为自动化测试框架有一个主要的main.py 里面实现了各个函数定义,然后每个不同入参的自动化用例调用main.py里面的函数实现。
但是最近有个问题在于新增加了一个Mode,也就多了一个if分支,但是我不想在每个自动化用例的入参接口增加(因为自动化用例太多了),计划是在main()里面加一个flag,然后在函数定义的里面加if分支。
我的初步想法是写一个 全局变量, 针对不同的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()
回答:
由于作用域的影响,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
以上是 python 全局变量当发生文件嵌套时,是怎么保存的? 的全部内容, 来源链接: utcz.com/a/161355.html