from threading import Thread
import time
def print_k():
while true:
if main.k % 2 == 1: # ditto
print(main.k, "is even.") # <-- my problem is HERE ( Ignore all the other stuff )
time.sleep(2)
def main():
k = 1
while k != 200:
k += 1
print k
time.sleep(0.5)
if __name__ == '__main__':
Thread(target=print_k).start()
Thread(target=main).start()
在此脚本中(仅限示例,忽略所有实际功能)我正在尝试运行main()
,最多可添加200并打印它,在print_k
中,我正在打印{{1}变量,k。
我有一个异常提出,不出所料,我想知道我如何从一个不同的函数访问一个单独的函数的变量(顺便说一下,它们都在同一时间运行,因此是线程模块。)
答案 0 :(得分:2)
你无法打印main
的变量k
。局部变量的全部意义在于它们是本地的。它们是否在同一时间运行并不重要;他们每个人都有自己独立的当地环境。 (事实上,如果你拨打main
60次,那60个电话中的每一个都有自己的本地环境。)
但是你可以做很多事情。
最简单但通常最差的是使用全局变量而不是局部变量。只需将global k
添加到main
函数的顶部,在顶层添加k
的一些起始值(在任一线程开始之前),然后您现在可以在内部访问相同的全局变量print_k
。
在一个类中将共享状态和函数捆绑在一起,其中两个函数都成为可以访问self.k
的方法,这是一个更好的解决方案。向main
和print_k
传递某种可变的“持有者”也是一种更好的解决方案。
Queue.Queue
上)。
我将展示如何使用课程:
class KCounter(object):
def __init__(self):
self.k = 0
def print_k(self):
while True:
if self.k % 2 == 1:
print(self.k, "is even.")
time.sleep(2)
def main(self):
self.k = 1
while self.k != 200:
self.k += 1
print self.k
time.sleep(0.5)
if __name__ == '__main__':
kcounter = KCounter()
Thread(target=kcounter.print_k).start()
Thread(target=kcounter.main).start()
现在,因为我们正在使用self.k
,KCounter
实例的属性,而不是k
,一个局部变量,两种方法都会看到相同的变量。