从另一个函数访问函数的变量

时间:2014-10-22 01:22:04

标签: python multithreading function python-2.7 user-defined-functions

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。 我有一个异常提出,不出所料,我想知道我如何从一个不同的函数访问一个单独的函数的变量(顺便说一下,它们都在同一时间运行,因此是线程模块。)

1 个答案:

答案 0 :(得分:2)

无法打印main的变量k。局部变量的全部意义在于它们是本地的。它们是否在同一时间运行并不重要;他们每个人都有自己独立的当地环境。 (事实上​​,如果你拨打main 60次,那60个电话中的每一个都有自己的本地环境。)

但是你可以做很多事情。

最简单但通常最差的是使用全局变量而不是局部变量。只需将global k添加到main函数的顶部,在顶层添加k的一些起始值(在任一线程开始之前),然后您现在可以在内部访问相同的全局变量print_k

在一个类中将共享状态和函数捆绑在一起,其中两个函数都成为可以访问self.k的方法,这是一个更好的解决方案。向mainprint_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.kKCounter实例的属性,而不是k,一个局部变量,两种方法都会看到相同的变量。