При покупке приложения тип будет использоваться для ниже требования

Вот новый пример, который подчеркивает структуру данных и содержимое закрытия, чтобы помочь уточнить, когда закрытый контекст «сохранен».

def make_funcs():
    i = 42
    my_str = "hi"

    f_one = lambda: i

    i += 1
    f_two = lambda: i+1

    f_three = lambda: my_str
    return f_one, f_two, f_three

f_1, f_2, f_3 = make_funcs()

Что находится в закрытии?

>>> print f_1.func_closure, f_1.func_closure[0].cell_contents
(<cell at 0x106a99a28: int object at 0x7fbb20c11170>,) 43 

Примечательно, что my_str не находится в закрытии f1.

Что находится в закрытии f2?

>>> print f_2.func_closure, f_2.func_closure[0].cell_contents
(<cell at 0x106a99a28: int object at 0x7fbb20c11170>,) 43

Обратите внимание (из адресов памяти), что оба закрытия содержат одинаковые объекты. Итак, вы можете запустить , чтобы думать о лямбда-функции как о ссылке на область. Однако my_str не находится в замыкании для f_1 или f_2, а i не находится в замыкании для f_3 (не показано), что предполагает, что объекты замыкания сами по себе являются отдельными объектами.

Являются ли сами объекты замыкания тот же объект?

>>> print f_1.func_closure is f_2.func_closure
False
0
задан zooropa 26 March 2019 в 22:05
поделиться