Я выполнял фрагмент кода, который неожиданно выдал логическую ошибку в одной части программы. При изучении раздела я создал тестовый файл для проверки набора выполняемых операторов и обнаружил необычную ошибку, которая кажется очень странной.
Я проверил этот простой код:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original to something else
print(list(f)) # Outputs filtered
И вывод был:
>>> []
Да ничего. Я ожидал, что понимание фильтра получит элементы в массиве с числом 2 и выведет это, но я не получил этого:
# Expected output
>>> [2, 2]
Когда я закомментировал третью строку, чтобы проверить ее еще раз:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
### array = [5, 6, 1, 2, 9] # Ignore line
print(list(f)) # Outputs filtered
Вывод был верным (вы можете проверить это сами):
>>> [2, 2]
В какой-то момент я вывел тип переменной f
:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original
print(type(f))
print(list(f)) # Outputs filtered
И я получил:
>>> <class 'generator'>
>>> []
Почему обновление списка в Python изменяет вывод другой переменной генератора? Это кажется мне очень странным.