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Сообщить о неточности