この問題は、scopeと呼ばれるものに関連しています。
簡単に言えば、main
関数内で最初に「p」という変数を作成したことです。p
ただし、それは、作成する他の関数がその存在を認識できるという意味ではありません。
例を挙げれば分かりやすいと思います。の最初の行でright_movement
、あなたはp = p + 1
. を使用して 1 を追加しているため、Python は内でp
変数が割り当てられているかどうかを確認します。そうしなかったので、レイヤーを「上に移動」して、ファイル内で一般的に変数を割り当てたかどうかを確認します。それらのいずれにも代入しなかったため(内部で代入した)、Python はあきらめます。p
right_movement
p
p
main
これにはいくつかの解決策があります。手っ取り早い方法は、「グローバル」変数と呼ばれるものを使用することで、次のようになります。
import random
p = 5
m = 0
times = [0] * 11
def right_movement():
global p
global m
global times
p = p + 1
m = m + 1
times[p] = p
print times
def left_movement():
global p
global m
global times
p = p - 1
m = m + 1
times[p] =+ 1
print times
def main():
times[p] = 1
print times
while p >= 0 and p <= 10:
x = random.randint(0, 1)
if x > 0:
right_movement()
else:
left_movement()
if p == 11:
print "Movement to the right into location 11."
print "Number of moves is " + str(m) + "."
else:
print "Movement to the left into location 0."
print "Number of moves is " + str(m) + "."
main()
p
、m
、およびtimes
変数を関数の外にファイルに移動し、新しい変数を一時的に作成するのではなく、関数内の変数を変更することを Python に知らせるキーワードをmain
必ず使用してください。global
ただし、これは最もクリーンな解決策ではありません。グローバル変数の使用は、さまざまな理由から悪い習慣と見なされています。
より良い解決策は、 内の状態を追跡しmain
、コードを次のように書き直すことです。
import random
def right_movement(times, p):
p += 1
times[p] += 1
return p
def left_movement(times, p):
p -= 1
times[p] =+ 1
return p
def main():
p = 5
moves = 0
times = [0] * 11
times[p] = 1
print times
while 0 <= p <= 10:
moves += 1
x = random.randint(0, 1)
if x > 0:
p = right_movement(times, p)
else:
p = left_movement(times, p)
print times
if p == 11:
print "Movement to the right into location 11."
print "Number of moves is " + str(moves) + "."
else:
print "Movement to the left into location 0."
print "Number of moves is " + str(moves) + "."
main()