0
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 ' s, k. я исключение подняло, что неудивительно, и мне интересно, как я могу получить доступ к переменному отдельной функции от другой функции (они оба работают в то же время, кстати, следовательно, модуль Threading.)Доступ к переменной некоторой функции из другой функции

+0

В качестве побочного примечания 'true' является' NameError'. И использование Python 3.x-style 'print' в 2.x будет уродливым (вы увидите' (2, 'even') 'вместо' 2 is even') – abarnert

ответ

2

You не может печать 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, локальную переменную, оба метода см той же переменной.

+0

Я думал об использовании глобальное значение, но классы выглядят намного приятнее, поэтому спасибо! – Peaser

Смежные вопросы