Область действия лямбда-функций и их параметров
Лямбда-функции — это анонимные функции, которые могут захватывать область действия охватывающей их функции. Это позволяет им получать доступ к переменным и параметрам из родительской области. Однако такое поведение иногда может привести к неожиданным результатам, когда лямбда-функции используют параметры, которые изменяются внутри включающей функции.
Чтобы проиллюстрировать проблему, рассмотрите следующий код:
def callback(msg):
print(msg)
# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
# Calling the lambda functions
for f in funcList:
f()
Ожидаемый результат этого кода:
do re mi
Однако фактический результат:
mi mi mi
Это связано с тем, что лямбда-функции захватывают ссылку на переменную m из охватывающей области. Когда итератор выполняет цикл, он присваивает значение «mi» значению m на последней итерации. В результате все лямбда-функции при выполнении ссылаются на «mi», даже если во время создания им были переданы разные значения.
Чтобы решить эту проблему, вы можете записать значение m по адресу время создания лямбда-функции, используя ее в качестве значения по умолчанию необязательного параметра:
for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))
Это гарантирует, что каждая лямбда-функция имеет доступ к своей собственной копии m, фиксируя значение, присвоенное во время итерации цикла. Результатом этого кода будет:
do re mi
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3