4

私はこれを持っています:

>>> a = lambda : lambda x : x * x 

これにより、毎回一定のアドレスが得られます。

>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>

ただし、そうではありません。なんでそうなの?また、アドレスが 2 つしかないことに注意してください。なんでそうなの?内部ラムダ関数はその場で作成され、呼び出すたびに返されa()ますか? a が宣言されたときに作成されませんでしたか?

>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
4

2 に答える 2

2

a変数としての関数そのものです。メモリ内で何らかの方法で移動しない限り、そのアドレスは変更されません。

a()実際に関数を呼び出します。関数は、 経由で呼び出されるまで何もしません()。そうです、ここで内部ラムダ関数がその場で作成されています。それがそこに表示されるアドレスになります。Blckknght がコメントしたように、ガベージ コレクションはおそらくメモリの再利用につながります。

于 2013-08-14T02:06:02.527 に答える
1

はい、あなたの理解は正しいです。「内側」のラムダは、「外側」のラムダが評価されるときにのみ作成されます。これは、(外側の) ラムダが呼び出されるまで発生しません。

于 2013-08-14T02:05:20.927 に答える