«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать неожиданных результатов при изменении параметров в лямбда-функциях

Как избежать неожиданных результатов при изменении параметров в лямбда-функциях

Опубликовано 18 ноября 2024 г.
Просматривать:227

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Область действия лямбда-функций и их параметров

Лямбда-функции — это анонимные функции, которые могут захватывать область действия охватывающей их функции. Это позволяет им получать доступ к переменным и параметрам из родительской области. Однако такое поведение иногда может привести к неожиданным результатам, когда лямбда-функции используют параметры, которые изменяются внутри включающей функции.

Чтобы проиллюстрировать проблему, рассмотрите следующий код:

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
Заявление о выпуске Эта статья перепечатана по адресу: 1729329919. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3