Python Glossary English

Python 3.8+typesпонятие

types.CellType

объекты интерпретатора

Тип ячейки замыкания: в ней живёт переменная внешней функции, которую видит вложенная. Ячейки лежат в func.__closure__.

Синтаксис

func.__closure__[0].cell_contents

Ячейка хранит переменную, а не её значение на момент создания функции. Отсюда знаменитая ловушка: lambda, созданные в цикле, делят одну ячейку i и после цикла все видят последнее значение. Содержимое читается через cell.cell_contents. Лечится значением по умолчанию (lambda i=i: i), которое вычисляется сразу, или functools.partial.

Примеры

import types
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs])  # → [2, 2, 2]
cell = funcs[0].__closure__[0]
print(isinstance(cell, types.CellType), cell.cell_contents)  # → True 2
fixed = [lambda i=i: i for i in range(3)]
print([f() for f in fixed])  # → [0, 1, 2]

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности