Переменная i
является глобальным, значение которого равняется 2 каждый раз, функция f
вызвана.
я был бы склонен реализовать поведение, которое Вы после следующим образом:
>>> class f:
... def __init__(self, multiplier): self.multiplier = multiplier
... def __call__(self, multiplicand): return self.multiplier*multiplicand
...
>>> flist = [f(i) for i in range(3)]
>>> [g(2) for g in flist]
[0, 2, 4]
Ответ на Ваше обновление : это не глобальные из i
по сути , который вызывает это поведение, это - то, что это - переменная от объема включения, который имеет фиксированное значение за времена, когда f называют. В Вашем втором примере значение i
принято от объема эти kkk
функция, и ничто не изменяет это, когда Вы вызываете функции на flist
.
Вы можете использовать модуль многопроцессорности , добавленный в Python 2.6. Вы можете использовать пулы процессов, а затем получать результаты асинхронно с помощью:
apply_async(func[, args[, kwds[, callback]]])
Например:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=1) # Start a worker processes.
result = pool.apply_async(f, [10], callback) # Evaluate "f(10)" asynchronously calling callback when finished.
Это только одна альтернатива. Этот модуль предоставляет множество возможностей для достижения желаемого. Также из этого будет действительно легко сделать декоратор.
Что-то вроде:
import threading
thr = threading.Thread(target=foo, args=(), kwargs={})
thr.start() # Will run "foo"
....
thr.is_alive() # Will return whether foo is running currently
....
thr.join() # Will wait till "foo" is done
Подробнее см. В документации на https://docs.python.org/library/threading.html .
Есть ли причина не использовать потоки? Вы можете использовать класс threading
.
Вместо finished ()
используйте функцию isAlive ()
. Функция result ()
может join ()
поток и получить результат. И, если возможно, переопределите функции run ()
и __ init __
, чтобы вызвать функцию, указанную в конструкторе, и сохранить значение где-нибудь в экземпляре класса.
Это не в ядре языка, а в очень зрелой библиотеке, которая делает то, что вы хотите, - это Twisted . Он представляет объект Deferred, к которому вы можете прикреплять обратные вызовы или обработчики ошибок («errbacks»). Deferred - это, по сути, «обещание», что функция в конечном итоге даст результат.