Ваша лямбда-функция содержит ссылку на s
, следовательно, последнее присвоенное значение s печатается при вызове вне цикла for. Попробуйте приведенный ниже код для вашего ожидаемого поведения. Здесь копия этой существующей ссылки s
создается в v
в качестве аргумента функции, и это значение печатается внутри функции f
.
class X:
pass
xs = []
for s in ("one", "two", "three"):
x = X()
def f(v=s): print(v)
x.f = f
xs.append(x)
for x in xs:
x.f()
Выход:
one
two
three