2017-10-09 10 views
1

誰かがラムダ関数を作ろうとしており、入力引数以外のラムダ関数のすべてを関数のローカル変数のように扱いたいとします。彼らはどのようにそれを達成するだろうか?変数が「ローカル」であるということは、ラムダ関数の外部からの変数へのアクセスがないことを意味します。lamda関数のローカル変数がPythonで変更されないようにするにはどうしたらいいですか?

コード

right = 5 

demo_lamb = lambda left : print("INSIDE LAMB left == ", left, ",", "right == ", right) 

for lt in range(0, 5): 
    demo_lamb(lt) 
    right = 100*lt + 99 
    print("OUTSIDE LAMB    right == ", right) 

印刷出力

INSIDE LAMB left == 0 , right == 5 
OUTSIDE LAMB    right == 99 
INSIDE LAMB left == 1 , right == 99 
OUTSIDE LAMB    right == 199 
INSIDE LAMB left == 2 , right == 199 
OUTSIDE LAMB    right == 299 
INSIDE LAMB left == 3 , right == 299 
OUTSIDE LAMB    right == 399 
INSIDE LAMB left == 4 , right == 399 
OUTSIDE LAMB    right == 499  

所望の出力我々はラムダ関数の内部変数のすべての値を "凍結" するにはどうすればよい

INSIDE LAMB left == 0 , right == 5 
OUTSIDE LAMB    right == 99 
INSIDE LAMB left == 1 , right == 5 
OUTSIDE LAMB    right == 199 
INSIDE LAMB left == 2 , right == 5 
OUTSIDE LAMB    right == 299 
INSIDE LAMB left == 3 , right == 5 
OUTSIDE LAMB    right == 399 
INSIDE LAMB left == 4 , right == 5 
OUTSIDE LAMB    right == 499 

(除きます入力引数)は、ラムダ関数が作成されたときのものと同じになりますか? copyのインポートとcopy.deepcopy(right)とラムダ関数内rightを交換

ソリューション失敗しました

一つは一切出力に違いはありません。

+0

変数をラムダ関数にバインドする必要があります。 –

+2

'some_var = lambda​​'を使用している場合は、最初に 'lambda'を使用すべきではありません。' lambda'が匿名であるという利点**を打ち消します。 –

+0

そして、問題は 'right'はローカル変数ではなく、関数上で閉じた*フリー変数です。問題は、Pythonに字句的スコープがあることです。したがって、 'right'は常にグローバルスコープの' right'を指します。一番良いことは、それをパラメータにすることです。また、これは 'lambda'関数とは関係ありませんが、**すべての関数はこのように動作します** –

答えて

1

全てのクロージャの導入前にさかのぼり、通常のトリックは、「オプションのパラメータ」を使用することです:関数が定義されている場合

demo_lamb = lambda left, right=right: print("INSIDE LAMB left == ", left, ",", "right == ", right) 

デフォルトの引数は正確に何をしたいである、評価されますが。

関連する問題