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

Posted

技术标签:

【中文标题】从另一个函数访问一个函数的变量【英文标题】:Accessing a function's variable from another function 【发布时间】:2014-10-22 01:22:04 【问题描述】:
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 中,我正在打印 main 的变量 k . 不出所料,我提出了一个异常,我想知道如何从不同的函数访问单独的函数变量(顺便说一下,它们都同时运行,因此是线程模块。)

【问题讨论】:

附带说明,trueNameError。在 2.x 中使用 Python 3.x 风格的print 会很丑(你会看到(2, 'is even') 而不是2 is even 【参考方案1】:

不能打印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(局部变量),所以两种方法都看到同一个变量。

【讨论】:

我曾想过使用全局值,但类似乎更好,所以谢谢!

以上是关于从另一个函数访问一个函数的变量的主要内容,如果未能解决你的问题,请参考以下文章

Angular2从另一个类访问函数/变量

无法从另一个函数(在全局范围内定义)访问变量(数组)

C# 访问传递给窗口的 ref 变量,从另一个窗口函数

如何从另一个函数访问布尔数组? C++

如何从另一个类访问函数?

寻找一种从另一个插件访问全局变量的方法