0

基本的なシミュレーションを実行するプログラムを作成しようとしています。10 個のボックスの列を作成し、乱数ジェネレーターに移動方向を選択させ、追跡します。最近の問題は、最初の位置が友好的ではないことです。真ん中の 5 つから始めたいのですが、その行をどこに置いてもエラーが発生します。

コードは次のとおりです。

import random


def right_movement():
    p = p + 1
    m = m + 1
    times[p] = p
    print times


def left_movement():
    p = p - 1
    m = m + 1
    times[p] =+ 1

def main():
    p = 5
    times = [0] * 11
    times[p] = 1
    m = 0
    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 " + m + "."
    else:
        print "Movement to the left into location 0."
        print "Number of moves is " + m + "."


main()

をどこに置いてもp = 5、それを参照してエラーが発生します。私はPython 2.7を実行しています。

4

2 に答える 2

3

この問題は、scopeと呼ばれるものに関連しています。

簡単に言えば、main関数内で最初に「p」という変数を作成したことです。pただし、それは、作成する他の関数がその存在を認識できるという意味ではありません。

例を挙げれば分かりやすいと思います。の最初の行でright_movement、あなたはp = p + 1. を使用して 1 を追加しているため、Python は内でp変数が割り当てられているかどうかを確認します。そうしなかったので、レイヤーを「上に移動」して、ファイル内で一般的に変数を割り当てたかどうかを確認します。それらのいずれにも代入しなかったため(内部で代入した)、Python はあきらめます。pright_movementppmain

これにはいくつかの解決策があります。手っ取り早い方法は、「グローバル」変数と呼ばれるものを使用することで、次のようになります。

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()

pm、および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()
于 2013-08-28T03:36:49.147 に答える
1

値を引数として関数に渡さずに、複数の関数間で同じ変数を共有しようとしています。これを行うには、グローバル変数を使用する必要があります。

このようなもの:

import random
p = 5
times = [0] * 11
m = 0

def right_movement():
    global p, times, m
    p = p + 1
    ...

したがって、最初に関数の外部で変数を宣言する必要があり、次に変数を使用する各関数でそのグローバルステートメントが必要です。

于 2013-08-28T03:31:59.097 に答える