ビーズリーPG 100は言及:obj .__ closure__には正確に何が入っていますか?
>>>python.__closure__
(<cell at 0x67f50: str object at 0x69230>,)
>>>python.__closure__[0].cell_contents
私の理解では__closure__
がリストであるが、すべてこの の細胞のものとstrオブジェクトが何ということです?それは1-aryタプルのように見えますか?
ビーズリーPG 100は言及:obj .__ closure__には正確に何が入っていますか?
>>>python.__closure__
(<cell at 0x67f50: str object at 0x69230>,)
>>>python.__closure__[0].cell_contents
私の理解では__closure__
がリストであるが、すべてこの の細胞のものとstrオブジェクトが何ということです?それは1-aryタプルのように見えますか?
閉鎖セルは、関数が必要とする値を参照しますが、周囲のスコープから取得します。
Pythonはネストされた関数をコンパイルするとき、ネストされた関数と親スコープの両方のコードオブジェクト内の親関数(グローバルではありません)でのみ参照される変数を書き留めます。これらは、それぞれ、これらの関数の__code__
オブジェクトのco_freevars
およびco_cellvars
属性です。
親関数が実行されるときにネストされた関数を作成すると、これらの参照がネストされた関数にクロージャを付加するために使用されます。
関数クロージャは、空き変数(co_freevars
という名前)ごとに1つのセルのタプルを保持します。セルは親スコープのローカル変数への特別な参照で、それらのローカル変数が指す値に従います。これは、最良の例で示されている:上記の例で
def foo():
def bar():
print(spam)
spam = 'ham'
bar()
spam = 'eggs'
bar()
return bar
b = foo()
b()
、機能bar
関数foo
にspam
を指し示す1つの閉鎖セルを有しています。セルはspam
の値に従います。さらに重要なことに、が表示されてからbar
が返されると、spam
がfoo
に存在しなくても、セルは値(文字列eggs
)を参照し続けます。
従って、上記のコード出力:
>>> b=foo()
ham
eggs
>>> b()
eggs
とb.__closure__[0].cell_contents
は'eggs'
あります。
bar()
がと呼ばれるとき、クロージャは逆参照されます。。クロージャはここで値を取得しません。すべての3つのlambda
機能がspam
変数を参照するので、
def foo():
bar = []
for spam in ('ham', 'eggs', 'salad'):
bar.append(lambda: spam)
return bar
for bar in foo():
print bar()
上記行にsalad
三回を印刷する:つまり、ループ変数を参照する(lambda
式またはdef
ステートメントで)ネストされた関数を生成する際に違いが関数オブジェクトが作成されたときにバインドされた値ではありません。 for
ループが終了するまでには、spam
は'salad'
にバインドされていたため、3つのクロージャはすべてその値に解決されます。
古いfunc_closure
の新しいPython 3の名前です。
http://docs.python.org/3.0/whatsnew/3.0.html
func_X
という名前の関数属性は、ユーザー定義の属性の機能属性の名前空間でこれらの名前を解放し、__X__
フォームを使用するために名前が変更されました。ウィット、func_closure
、func_code
、func_defaults
、func_dict
、func_doc
、func_globals
に、func_name
は、それぞれ、__closure__
に__code__
、__defaults__
、__dict__
、__doc__
、__globals__
、__name__
と改名されました。一言で言えば
:
__closure__
がNone
または関数の自由変数のバインディング含む細胞のtuple
です。
また、書き込み不可能です。
参考:foo
として
>>>
['I am free', 'I am free too']
使用している機能bar
を返して:出力がhttp://docs.python.org/ref/types.html
例パイソン< 3(私はfunc_closure
を使用しています)
def foo():
x = "I am used"
y = "I am free"
z = "I am free too"
def bar(x):
return x, y, z
return bar
c = foo().func_closure
print [i.cell_contents for i in c]
それ自身の価値x
であるが、y
またはz
ではない。したがって、彼らは__closure__
になります。
>>> def f():
... a = "HELO"
... b = 1.0
... def w(c):
... return a,b,c
... return w
>>> w = f()
>>> w.__closure__
(<cell at 0xa05c4ac: str object at 0x9e91b74>, <cell at 0xa05c3bc: float object at 0xb733dde8>)
>>> w.__closure__[0].cell_contents
'HELO'
>>> w.__closure__[1].cell_contents
1.0
私はどこにも使用さセルタイプを見たことがありません。クロージャ変数を保持するのは目的に合っているようです。