В ходе реализации алгоритма "Variable Elimination" для программы Bayes Nets я обнаружил неожиданную ошибку, которая была результатом итеративного преобразования карты последовательности объектов.
Для простоты я использую здесь аналогичный фрагмент кода:
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
...
>>> list(nums)
[31, 32, 33]
Это, безусловно, неправильный результат. Поскольку [4, 5, 6] содержит два четных числа, 10
следует добавлять к каждому элементу не более двух раз. Я тоже получал неожиданное поведение в алгоритме VE, поэтому я изменил его, чтобы преобразовать итератор map
в list
после каждой итерации.
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
... nums = list(nums)
...
>>> list(nums)
[21, 22, 23]
Из моего понимания итераций эта модификация не должна ничего менять, но это так. Очевидно, что преобразование n + 10
для случая not x % 2
применяется один раз в версии list
-ed.
Программа My Bayes Nets также работала после обнаружения этой ошибки, но я ищу объяснение, почему это произошло.