この質問はここで尋ねられる他の質問と似ていますが、回答を読んだ後、私はそれをつかむことはできません。 Pythonでネストされた関数を使ったスコープ
新しいコードをスケッチしながら
は、私は自分自身のような文の多くを追加見つける:それはいつも書いていることを面倒になったprint('var=')
pprint(var)
ので、私は、私は機能にそれを作ることができると思いました。私は前の行に変数名を印刷したいので、私が試した:
def dbp(var):
eval('print(\'{0}=\')'.format(var))
eval('pprint({0})'.format(var))
をので、私はのようなものを行うの操作を行います。
foo=
'bar'
これがすべてですが印刷さ
foo = 'bar'
dbp('foo')
を素晴らしいですが、私がそれを関数で使うために行くと、物事はうんざりします。例えば、
def f():
a = ['123']
dbp('a')
f()
は、NameError(NameError:name 'a'は定義されていません)を発生させます。
私の予想は、dbp()はf()のスコープ内のものには読み取りアクセス権を持っていましたが、明らかにそうではありません。なぜ誰かが説明できますか?
また、変数の名前に続けて書式設定された内容を印刷する方が良い方法もあります。
'foo'がモジュールに対してローカルな' DBP( ) 'がモジュールスコープにあるので、モジュールスコープにアクセスできます。 'a'は' f() 'に対してローカルです。' dbp() 'は' f() 'のスコープにアクセスできません。 'f()'の中で 'def dbp()'を実行していた場合、 'f()'のスコープにアクセスできます。この問題のハックは 'locals()'を渡すことであり、 'locals()['a']'を使うことができ、 'eval()'文は必要ありません。 – AChampion
どちらの場合も、文字列を渡すと、evalはその変数を試して印刷します。その変数がevalのスコープにある場合、それが出力されます。それ以外の場合は、そうではありません。 –
なぜ最初に 'print()'が 'eval()'されていますか? 'print( '{0} ='。format(var))'しませんか? – AChampion