私はSHA2017バッジに手を差しています。私は、以下のプログラムを書き、シミュレータでそれを実行しました:これはMicroPythonのバグですか?
import ugfx
import badge
def key_pressed(key, is_pressed):
print('key_pressed(key=%r, is_pressed=%r)' % (key, is_pressed))
badge.init()
ugfx.init()
ugfx.input_init()
for key in [ugfx.JOY_LEFT, ugfx.JOY_UP, ugfx.JOY_RIGHT, ugfx.JOY_DOWN]:
ugfx.input_attach(key, (lambda is_pressed: key_pressed(key, is_pressed)))
# Uncommenting this makes all keystrokes get interpreted as JOY_UP:
# ugfx.input_attach(key, (lambda is_pressed: key_pressed(key, is_pressed)))
# But uncommenting this makes JOY_UP work as intended and doesn't affect other keys
# ugfx.input_attach(ugfx.JOY_UP, (lambda is_pressed: key_pressed(ugfx.JOY_UP, is_pressed)))
while True:
pass
私はこれを実行すると、任意のキーを押すと、私はJOY_DOWNを押したと言うだろう。最初の行のコメントを外すと、JOY_UPを押して、最後のコメント行のコメントを外すだけで、意図したとおりに動作するJOY_UPを除いて、すべてのキーがJOY_DOWNになります。
これはバグか意図した動作ですか? MicroPythonがラムダをコンパイルするのは一度だけで、 "key"への参照が結びついているようです。
コメント行は同一であるように見えます。 – user2357112
@ user2357112あなたは正しいです、私はそれを変更しました – d33tah
他の多くの言語とは異なり、Pythonの 'lambda'はクロージャを構成しません。それは依然として外部変数を参照し、ローカルコピーは参照しません。 – 9000