Не знаю, баг ли это, или я не понимаю некоторых особенностей языка, но вот примеры.
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?