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

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

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

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

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

我的初步想法是写一个 全局变量, 针对不同的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

回到顶部