データファイルを処理するための短いコードを書いていて、ラムダ関数が動作する方法でわからないものを見つけました。ラムダ関数がローカルスコープを使用していません
ここに問題があります:私は、キーワードのリストと、それらのキーワードがデータファイル内に現れる行のインデックスのリストを持っていて、その行に特定の操作を適用したい(および/またはしたがって、単純に行のリストではなく、インデックスのリストが必要です)。
これを行うには、必要な操作を目的の行に適用するラムダ関数を各キーワードに関連付ける辞書を定義しました。例:
methnames = {'acell' : lambda i : float(dat[i][1]) } #with dat the data file
(複数のキーワードとより複雑な機能を除く)。私はdat
が定義されますローカルスコープ内からこれらの関数を呼び出すと同じように、私は予想通り
は今、それを実行するために、それは定義するdat
という名前のグローバル変数を持つことが必要なので、私はちょうどdat=[]
を置きます。私は、全体のコードを実行する場合を除き
、私はIndexError
取得し、トレースバックはそのラムダが実際にdat
が正常に定義されるべきローカルスコープ内から呼び出された場合でも、それはまだグローバルdat
使用しています、と言われます。
私はそれを回避することができますが、これはPythonにとって非常に奇妙な動作のようですので、おそらく何か不足しています。
dat=[]
methnames = {'acell' : lambda i : float(dat[i][1]) }
def test(dat):
return(methnames['acell'](0))
a=test([['acell',0,1,1]])
通常a=0
を与え、そしてここに戻っているはずです:ここで
は、コードの簡易版である
Traceback (most recent call last):
File "<ipython-input-21-cc8eb6df810c>", line 1, in <module>
runfile('/home/penwwern/Documents/mineralo/MinPhys/FrI/out/test.py', wdir='/home/penwwern/Documents/mineralo/MinPhys/FrI/out')
File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile
execfile(filename, namespace)
File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "/home/penwwern/Documents/mineralo/MinPhys/FrI/out/test.py", line 18, in <module>
a=test([['acell',0,1,1]])
File "/home/penwwern/Documents/mineralo/MinPhys/FrI/out/test.py", line 15, in test
return(methnames['acell'](0))
File "/home/penwwern/Documents/mineralo/MinPhys/FrI/out/test.py", line 9, in <lambda>
methnames = {'acell' : lambda i : float(dat[i][1]) }
IndexError: list index out of range
あなたのリストはいえ、 'lambda'がアクセスしているリストではありません –
@MosesKoledoye存在しないインデックス0インデックス1に1つだけの項目(別のリスト)を持っています。 – jonrsharpe
@MosesKoledoye実際には、コードを省略して訂正しても、問題は同じ – penwy