Pertanyaannya sudah dijawab oleh aaronasterling
Namun, seseorang mungkin tertarik pada bagaimana variabel disimpan di bawah tenda.
Sebelum datang ke cuplikan:
Penutupan adalah fungsi yang mewarisi variabel dari lingkungan terlampirnya. Ketika Anda melewatkan fungsi panggilan balik sebagai argumen ke fungsi lain yang akan melakukan I / O, fungsi panggilan balik ini akan dipanggil nanti, dan fungsi ini akan - hampir secara ajaib - mengingat konteks di mana ia dinyatakan, bersama dengan semua variabel yang tersedia dalam konteks itu.
Jika suatu fungsi tidak menggunakan variabel bebas itu tidak membentuk penutupan.
Jika ada level dalam lain yang menggunakan variabel bebas - semua level sebelumnya menyimpan lingkungan leksikal (contoh di akhir)
atribut fungsi func_closure
dalam python <3.X atau __closure__
dalam python> 3.X menyimpan variabel gratis.
Setiap fungsi dalam python memiliki atribut penutupan ini, tetapi tidak menyimpan konten apa pun jika tidak ada variabel gratis.
contoh: atribut penutupan tetapi tidak ada konten di dalamnya karena tidak ada variabel gratis.
>>> def foo():
... def fii():
... pass
... return fii
...
>>> f = foo()
>>> f.func_closure
>>> 'func_closure' in dir(f)
True
>>>
NB: VARIABEL GRATIS HARUS MENCIPTAKAN PENUTUPAN.
Saya akan menjelaskan menggunakan cuplikan yang sama seperti di atas:
>>> def make_printer(msg):
... def printer():
... print msg
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer() #Output: Foo!
Dan semua fungsi Python memiliki atribut closure jadi mari kita periksa variabel-variabel penutup yang terkait dengan fungsi closure.
Berikut ini adalah atribut func_closure
untuk fungsi tersebutprinter
>>> 'func_closure' in dir(printer)
True
>>> printer.func_closure
(<cell at 0x108154c90: str object at 0x108151de0>,)
>>>
The closure
atribut mengembalikan tuple benda sel yang berisi rincian dari variabel didefinisikan dalam lingkup melampirkan.
Elemen pertama dalam func_closure yang bisa berupa None atau tuple sel yang berisi binding untuk variabel bebas fungsi dan hanya baca.
>>> dir(printer.func_closure[0])
['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
>>>
Di sini, di output di atas Anda dapat melihat cell_contents
, mari kita lihat apa yang disimpannya:
>>> printer.func_closure[0].cell_contents
'Foo!'
>>> type(printer.func_closure[0].cell_contents)
<type 'str'>
>>>
Jadi, ketika kita memanggil fungsi printer()
, ia mengakses nilai yang disimpan di dalam cell_contents
. Beginilah cara kami mendapatkan output sebagai 'Foo!'
Sekali lagi saya akan menjelaskan menggunakan cuplikan di atas dengan beberapa perubahan:
>>> def make_printer(msg):
... def printer():
... pass
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer.func_closure
>>>
Dalam cuplikan di atas, saya tidak mencetak pesan di dalam fungsi printer, sehingga tidak membuat variabel gratis. Karena tidak ada variabel gratis, tidak akan ada konten di dalam penutupan. Itulah tepatnya yang kita lihat di atas.
Sekarang saya akan menjelaskan cuplikan lain untuk membersihkan semuanya Free Variable
dengan Closure
:
>>> def outer(x):
... def intermediate(y):
... free = 'free'
... def inner(z):
... return '%s %s %s %s' % (x, y, free, z)
... return inner
... return intermediate
...
>>> outer('I')('am')('variable')
'I am free variable'
>>>
>>> inter = outer('I')
>>> inter.func_closure
(<cell at 0x10c989130: str object at 0x10c831b98>,)
>>> inter.func_closure[0].cell_contents
'I'
>>> inn = inter('am')
Jadi, kita melihat bahwa func_closure
properti adalah kumpulan sel penutupan , kita dapat merujuknya dan isinya secara eksplisit - sel memiliki properti "cell_contents"
>>> inn.func_closure
(<cell at 0x10c9807c0: str object at 0x10c9b0990>,
<cell at 0x10c980f68: str object at 0x10c9eaf30>,
<cell at 0x10c989130: str object at 0x10c831b98>)
>>> for i in inn.func_closure:
... print i.cell_contents
...
free
am
I
>>>
Di sini ketika kita menelepon inn
, itu akan merujuk semua variabel bebas simpan sehingga kita dapatkanI am free variable
>>> inn('variable')
'I am free variable'
>>>