@wows15
В автоматизации сила, брат

Неправильное поведение Thread с target=lambda?

Не знаю, баг ли это, или я не понимаю некоторых особенностей языка, но вот примеры.

from threading import Thread

threads = []
for i in range(2):
    threads.append(
        Thread(target=lambda: print(i))
    )

for t in threads:
    t.start()
    
# output:
# 1
# 1

from threading import Thread

threads = []
for i in range(2):
    Thread(target=lambda: print(i)).start()

# output:
# 0
# 1

from threading import Thread


threads = []
for i in range(2):
    threads.append(
        Thread(target=lambda i: print(i), args=[i])
    )

for t in threads:
    t.start()

# output:
# 0
# 1

Вопрос: почему первый код выдаёт не 0 1, а 1 1?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
@Vindicar
У тебя в первом случае тело потока (лямбда) захватывает через замыкание не значение i, а ссылку на i.
К моменту старта в первом случае i будет иметь другое значение.
Вот почему нужно использовать args - как во-втором случае. Тогда происходит захват значения - не через замыкание, а через параметр.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 дек. 2021, в 10:31
20000 руб./за проект
02 дек. 2021, в 10:30
5000 руб./за проект
02 дек. 2021, в 10:17
3000 руб./за проект