Главный подвох: обычно в Python 3 переменные цикла внутри list comprehension локальны и не «утекают» наружу, но walrus operator := специально создаёт или перезаписывает переменную в вмещающей области видимости.
Разбор по шагам в псевдо‑записи:
🔘Инициализация:
𝚡 = 𝟷𝟶 — внешняя переменная равна 10.
🔘List comprehension с walrus:
𝚗𝚞𝚖𝚜 = 𝚡 := 𝚒 𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟸)
— 𝚒 = 𝟶 → 𝚡 := 𝟶 (перезаписывает внешний 𝚡, теперь 𝚡 = 0)
— 𝚒 = 𝟷 → 𝚡 := 𝟷 (перезаписывает внешний 𝚡, теперь 𝚡 = 1)
— 𝚒 = 𝟸 → 𝚡 := 𝟸 (перезаписывает внешний 𝚡, теперь 𝚡 = 2)
Результат: 𝚗𝚞𝚖𝚜 = 𝟶, 𝟷, 𝟸, а внешний 𝚡 = 𝟸.
🔘Вывод:
𝚙𝚛𝚒𝚗𝚝(𝚡, 𝚗𝚞𝚖𝚜) → печатает 2 [0, 1, 2].
Сравнение с обычным list comprehension
> x = 10
> nums = [x for x in range(3)]
> print(x, nums)
Здесь вывод: 10 [0, 1, 2], потому что переменная x внутри comprehension локальна и не затрагивает внешнюю переменную.
Почему это важно
🔘Walrus operator := создан для присваивания внутри выражений, но его «утечка» в outer scope может быть неожиданной.
🔘В продакшен‑коде лучше использовать := осторожно, чтобы не перезаписать случайно важные переменные.
🔘Для чистого list comprehension без побочных эффектов используйте обычную переменную цикла, а не :=.
Post #4488
787
- 👍 4