2017-07-17 5 views
1

最初のプログラムは段階的に書かれ、期待通りに機能しました。これは一度に完全に定義した後で、タイトルで説明したエラーを投げた。 2番目のものを実行した後、私は最初のエラーを実行しました。私は最初のものが最初に働いた後、特に私が正しい骨を強く感じます。ここに最初ですPython 3.6.1は明確に定義した後、未定義の値/変数を述べています

a = {"piz":12, "san":23, "dg":45} 

def see(a): 
    if "dg" in a: 
     r = a["dg"] 
    return r 
print (r) 

def see(r): 
    return r + 1 

print (see(r)) 

ここにエラーがあります。

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python3.6/site-packages/spyder/util/site/sitecustomize.py", line 880, in runfileexecfile(filename, namespace) 
File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "/home/josh/python/viper.py", line 7, in <module> 
print (r) 
NameError: name 'r' is not defined 

第2の関数はさらに「クレイジー」であり、変数「e」を作成し、別の「f」を作成しません。

d = 3 
a = [1,2,3] 

b = [4,5,6] 

c = [7,8,9] 

#The function just checks if "d" is in "a", then creates variables "e" and "f" 
def enclosing(): 
    def abc(a, d): 
     if d in a: 
      print ("yes") 
      print (a[0]) 
    e = a[0] 
    f = a[1] 
    return 

    print (e) 
    print (f) 

そして、そのエラーです。

File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 
File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "/home/josh/python/d.py", line 25, in <module> 
print (e) 

NameError: name 'e' is not defined 
+1

'print(r)'を呼び出すときに 'r'を_clearly_定義しましたか?その時点であなたの 'r'は関数の中にあり(' see() '、それはグローバルとして宣言されていないのでそのまま残されます)、もちろん、Pythonはあなたが何を印刷したいのか分からないとき。 – zwer

+0

_variableスコープについては、それらが存在する場所と存在しない場所について少し学んでください。また、関数を定義すると、関数を実際に呼び出すまで実行されません。インターネットからのランダムなヒット:https://www.smallsurething.com/how-variable-scope-works-in-python/(私は詳細を読んでいないが、役に立つと思われる)。 – tevemadar

+0

ありがとう、今私はそれがスコープについてすべてであることを見る。私はそれを調べます。 – Minyae

答えて

0

これらの変数は、意図するところで定義していないか、そのスコープで定義されていないままにしておきます。まず、最初のスニペットでは同じ関数を2回定義していますが、決して良い考えではありません。最初の定義では、文if "dg" in a:がTrueと評価された場合にのみrが定義されます。したがって、これがFalseの場合はエラーが発生します(if文の前にrのプレースホルダ値を設定することをお勧めします)。

2番目のコードスニペットでは、関数内に2つの変数を定義しますが、関数の外でそれらにアクセスしようとします。これらの変数は、関数スコープ内でのみ定義されます(ほとんどの言語で、Pythonを含む関数内で定義された変数はその関数に対してローカルであり、その外部ではアクセスできません)ので、それらの変数をその関数をグローバル変数にする。

+0

"IF"ステートメントのデザインを意図していました。ありがとう、私は残りの部分が今スコープについて見ています。 – Minyae

+0

問題ありません。あなたがアップボードしたり受け入れたりしても大丈夫なら –

関連する問題