python多文件多函数如何访问python跨模块全局变量量?

gadflycq 2023.5.24python中函数内部的变量和局部变量有着与C语言完全不一样的处理做法。1、在函数内部可以访问全局变量,可以读取值,可以输出显示,但不允许修改。2、即便函数内部对全局变量进行赋值操作,那也会被python当做是一个新的与全局变量同名的局部变量。赋值操作仅限于函数内部。在函数外部的全局变量值并不会被改变。3、如果在函数内部对全局变量进行自增自减之类的修改,程序直接会报错,无法执行。4、只有当在函数内部用global关键字显示的声明该变量是全局变量,才可以在函数内部对该全局变量进行正确的自增自减等修改操作。以下是4个测试程序及输出结果说明。###########测试程序1###############a=1def f():print(a) #在函数内部访问全局变量,会得到正确的值,将输出1f()###########测试程序2###############a=1def f():a=2 #在函数内部赋值全局变量,会新建一个同名局部变量,并不会真正修改全局变量的值print(a) #输出2f()print(a) #还是会输出1。函数内部的a赋值不会影响到全局变量的值。###########测试程序3###############a = 1def f():a=a+1 #程序会报错,无法执行。不允许在函数内部对全局变量进行修改。print(a)f()###########测试程序4###############a = 1def f():global a #显示的声明a为外部全局变量a=a+1 #此时程序会正确执行print(a) #输出2f()print(a) #输出在函数内部修改的值2
Below is my codeglobal PostgresDatabaseNameSchemaglobal RedShiftSchemaNamePostgresDatabaseNameSchema = NoneRedShiftSchemaName = Nonedef check_assign_global_values():if not PostgresDatabaseNameSchema:PostgresDatabaseNameSchema = "Superman"if not RedShiftSchemaName:RedShiftSchemaName = "Ironman"check_assign_global_values()But i am getting an error sayingTraceback (most recent call last):File "example.py", line 13, in check_assign_global_values()File "example.py", line 8, in check_assign_global_valuesif not PostgresDatabaseNameSchema:UnboundLocalError: local variable 'PostgresDatabaseNameSchema' referenced before assignmentSo can't we access or set the global variables from inside a function ?解决方案global should always be defined inside a function, the reason for this is because it's telling the function that you wanted to use the global variable instead of local ones. You can do so like this:PostgresDatabaseNameSchema = NoneRedShiftSchemaName = Nonedef check_assign_global_values():global PostgresDatabaseNameSchema, RedShiftSchemaNameif not PostgresDatabaseNameSchema:PostgresDatabaseNameSchema = "Superman"if not RedShiftSchemaName:RedShiftSchemaName = "Ironman"check_assign_global_values()You should have some basic understanding of how to use global. There is many other SO questions out there you can search. Such as this question Using global variables in a function other than the one that created them.
在同一个文件夹下调用一个函数delete.py文件(被调用的文件,(记得不要用4.py这样的数字作为被调用的文件否则无法调用,执行文件可以,例如下面的sky.py可以改为4.py))def add(x,y):
print('和为:%d'%(x+y))
sky.py文件import delete
delete.add(1,2)
或者from delete import add
add(1,2)
调用一个类delete.py文件(被调用的文件)class A:
def __init__(self,xx,yy):
self.x=xx
self.y=yy
def add(self):
print("x和y的和为:%d"%(self.x+self.y))
sky.py文件from delete import A
a=A(2,3)
a.add()
或者import delete
a=delete.A(2,3)
# 这个也是一个传参的手段
a.add()
在不同文件夹下delete.py文件的文件路径:E:\PythonProject\winycgimport sys
sys.path.append(r'E:\PythonProject\winycg')
'''python import模块时, 是在sys.path里按顺序查找的。
sys.path是一个列表,里面以字符串的形式存储了许多路径。
使用A.py文件中的函数需要先将他的文件路径放到sys.path中'''
import A
a=delete.A(2,3)
a.add()
其他补充:delete.py文件(被调用的文件)def app_lost(x):
print('%s : Hello !'%x)
print(3)
a='Matting'
app_lost(a)
print(4)
sky.py文件from delete import app_lost
k='Karry'
print(1)
if __name__ == "__main__":
app_lost(k)
print(2)
执行结果为Matting : Hello !341Karry : Hello !32如果不想执行delete的其他东西,只想用它的函数那么就要封装def app_lost(x):
print('%s : Hello !'%x)
print(3)
a='Matting'
if __name__ == "__main__":
# 封装,只有自己执行这个文件才会执行下面的语句
app_lost(a)
print(4)
参考:https://blog.csdn.net/winycg/article/details/78512300背景pyqt1.对于类中函数要用一个变量来做判断(用self.函数)class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.retranslateUi(self)
self.last_result = -1
# 一个判断机制变量
def press_picture(self):
# qt里面一个按钮触发press_picture槽函数,(python里面只会执行放在一个行的语句,这里有个tab空格所以不会执行得到
if last_max != self.last_result:
print(self.last_result)
2.函数之间调用变量(还是加global) class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.retranslateUi(self)
def press_picture(self):
global k
# 让k变为全局变量
k=3
def fly(self):# 也是一个槽函数
y=k+1
print(y) k=4
3.变量在类外面也是一样加global pic_name_num = 1
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.retranslateUi(self)
def press_picture(self):
global pic_name_num
# 反正哪里用到了都要加global
global model
if (pic_name_num == 1):
model =XXXXXXX
4.pyqt里面的调用函数(只是举例子看看就好)class MyWindow(QMainWindow, Ui_MainWindow):
def ShowCameraOneImage(self):
self.keyPressEvent()
# 加了self才可以调用其他函数
def keyPressEvent(self,event):
if (event.key() == Qt.Key_A):
print('hello,‘a’')
else: print(777)
5.如果一个文件调用另一个问价变量有两种方式1.aaa.py里面uuu=6
class MyWindow(QMainWindow, Ui_MainWindow):
print(uuu) #6
bbb.py里面class Ui_Dialog5(QtWidgets.QWidget,Ui_Form):
def __init__(self):
from aaa import uuu # 这样调用其实是一个副本,也就是局域变量,这里改变不会影响aaa.py里面的值
uuu = uuu+4
print(uuu)
# 10
2.用pickle(directory1就是变量)class Ui_Dialog3(QtWidgets.QWidget,Ui_Form):
def __init__(self):
super(Ui_Dialog3,self).__init__()
self.setupUi(self)
self.setWindowTitle("训练窗口")
self.retranslateUi(self)
self.setWindowIcon(QIcon('logo.png'))
if not os.path.exists('/home/test3_1.txt'):
os.mknod('/home/test3_1.txt')
f = open('/home/test3_1.txt', 'rb')
if os.path.getsize('/home/test3_1.txt'):
d = pickle.load(f)
self.lineEdit.setText("%s" % (d))
f.close()
def browse(self):
# global directory1
global k
global directory1
directory1 = QFileDialog.getExistingDirectory(self, "选取文件夹", "C:/")
# 起始路径
self.lineEdit.setText("%s" % (directory1))
c = directory1
f = open('/home/test3_1.txt', 'wb')
pickle.dump(c, f)
f.close()
关于import X 还有from x import * 这个问题import 模块:导入一个模块;注:相当于导入的是一个文件夹,是个相对路径。from…import:导入了一个模块中的一个函数;注:相当于导入的是一个文件夹中的文件,是个绝对路径。不推荐使用from x import * 因为怕和原来文件下有一样的名字就会名字冲突,而且这句话意思是把这个文件里面的东西全部导入,所有函数还有变量。明天再来多进程多线程

我要回帖

更多关于 python跨模块全局变量 的文章

 

随机推荐