Недавно я искал способ сгладить вложенный список python, например: [[1,2,3], [4,5,6]], в это: [1,2,3,4,5, 6].Как распознается список, чтобы сгладить список python?
Stackoverflow был полезным, как никогда, и я нашел a post с этим гениальным список понимания:
l = [[1,2,3],[4,5,6]]
flattened_l = [item for sublist in l for item in sublist]
Я думал, что я понял, как работает списочные, но, видимо, я не имею ни малейшего представления. Что озадачивает меня больше всего в том, что помимо выше понимания, это также работает (хотя это не дает тот же результат):
exactly_the_same_as_l = [item for item in sublist for sublist in l]
Может кто-нибудь объяснить, как питон интерпретирует эти вещи? Основываясь на втором составе, я бы ожидал, что питон интерпретирует его обратно, но, видимо, это не всегда так. Если это так, первое понимание должно вызвать ошибку, потому что «подписок» не существует. Мой ум полностью извращен, помогите!
Лучшим способом является переход к нормальному для циклов и использование печати, чтобы увидеть, что происходит –
Второе понимание работает только потому, что 'item' и' sublist' сохраняют свои окончательные значения от первого понимания. Запустите этот первый (или 'del item; del sublist', а затем сделайте это), и он будет давать' NameError', как ожидалось. Странность здесь приведена в правилах определения Python, а не в понимании. –
@MarkWhitfield Только в python2 ... в python3 list-comprehensions ведут себя как genexps и не пропускают переменные во внешней области. – Bakuriu