Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在函数中定义全局变量并传递给类_Python_Class_Function_Global Variables - Fatal编程技术网

Python 在函数中定义全局变量并传递给类

Python 在函数中定义全局变量并传递给类,python,class,function,global-variables,Python,Class,Function,Global Variables,有谁能帮忙吗, 我尝试每隔x分钟从下面代码中定义的类进程中采样一次数据(在这里没有显示的其他函数调用时运行) 为此,我每X分钟运行一次调度程序函数,由主函数启动,由函数minmax_job执行 然而,我的函数minmax_job似乎不知道i的初始值 我已经试了很多次关于放置全局变量等等,但它仍然不知道I=0(最初) i=0 atc、otc、tssc=0,0,0 atf、otf、tssf=假、假、假 类进程(threading.Thread): def uuu init uuuuu(自、缓冲区3、

有谁能帮忙吗, 我尝试每隔x分钟从下面代码中定义的类进程中采样一次数据(在这里没有显示的其他函数调用时运行) 为此,我每X分钟运行一次调度程序函数,由主函数启动,由函数minmax_job执行

然而,我的函数minmax_job似乎不知道i的初始值 我已经试了很多次关于放置全局变量等等,但它仍然不知道I=0(最初)

i=0
atc、otc、tssc=0,0,0
atf、otf、tssf=假、假、假
类进程(threading.Thread):
def uuu init uuuuu(自、缓冲区3、广播服务器):
threading.Thread.\uuuuu init\uuuuuu(自)
self.setDaemon(True)
self.buffer3=buffer3
self.factory=广播服务器
def运行(自):
今天=日期时间。现在()
上次运行的全局时间
全局atv1、atv2、atv3、otv1、otv2、otv3、tssv1、tssv2、tssv3
全球atf、otf、tssf
全球atc、otc、tssc
如果self.buffer3.startswith('厨房水族馆:温度:'):
self.temp=self.buffer3.替换('厨房水族馆:温度:','')
自我工厂广播(“水族箱温度%s”%自我温度)
如果atc==1且atf:
atv1=浮动(自身温度)
atf=错误
elif atc==2和atf:
atv2=浮动(自身温度)
atf=错误
elif atc==3和atf:
atv3=浮动(自身温度)
atf=错误
def minmax_作业():
全局atv1、atv2、atv3、otv1、otv2、otv3、tssv1、tssv2、tssv3
全球atf、otf、tssf
全球atc、otc、tssc、i
如果i==3:
i=0
atc=0
如果i<4:
atc=atc+1
atf=真
i=i+1
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
minmax_调度程序=调度程序()
minmax_调度程序。添加_间隔_作业(minmax_作业,秒=10)
minmax_调度程序.start()

我需要声明为全局,然后在外部作用域分配一个值,如本演示所示

global i
i=0

def rabbit():
    global i
    print "rabbit ",i


#main here
if __name__ == '__main__':
    rabbit()

上面的@Pillmuncher,有一个正确的想法作为副评论。我会给你一个完整的答案。您正试图通过全局变量在进程和/或线程之间共享数据。这是一种非常不正确的方法。如果月亮的相位是正确的,并且你不改变你在哪里发表评论,有时它可能会起作用,有时也可能不会

原因很复杂,但足以说明你应该找一家公司。Sci。有关操作系统的教科书,并查找以下术语:

  • 分叉
  • 线程安全
  • 多处理
  • 受保护内存
  • 竞赛条件
  • 消息队列
  • 进程间通信
  • 螺纹锁
  • 堆栈内存分配
  • 堆内存
在Python中,多处理模块和线程模块都提供了许多函数来声明共享内存并保证其安全。你喜欢安全(即使你还不知道)。安全是好的。安全可以(但并不总是)快速

如果你试图使用全局变量而不是来自多处理和线程模块的特性,你会在把自己挂在院子里的时候击中自己的脚:缓慢而痛苦,你会蔑视生活本身

那么,看看:

这有很多正确做事的好例子。提前声明您的VAR,将它们传递到每个线程/进程中,过上您真正想要过的正直生活


一般来说,您更喜欢多处理。多线程处理充满了麻烦,虽然它可以更快地执行,但您几乎不需要这样的速度。这种速度伴随着危险和麻烦,大量的调试时间(现在和以后),以及非常非常小心。最好像我这样的老前辈那样做:让多处理成为你的朋友,把线程扔进[主要是以微软为中心的]垃圾堆,不要去那里。

哦,天哪!请把它拿走@Ossama:通过全局变量(在您的例子中有很多)在线程之间进行无锁通信是desaster的一个秘诀。另外,您的
进程
线程有一个
run()
-方法,该方法执行一些语句,然后立即终止。通常,应该有一个循环。您的
进程
线程似乎与您描述的问题无关,因为它不在
i
@Ossama上运行:而且,如果您开始为变量编号,您真正想要的是一个列表。事实并非如此。在执行
rabbit()
中的
print
语句之前,只需要在全局命名空间中存在
i
,或者在
rabbit()
中为
i
赋值。不需要在全局命名空间中声明
i
global。pillmuncher,我认为你是对的,但是OP的问题在def块中有一个全局i。在OP的示例列表中,根据OP,这是使作用域有效所必需的。我将让其他人评论OP的代码
global i
i=0

def rabbit():
    global i
    print "rabbit ",i


#main here
if __name__ == '__main__':
    rabbit()