无法获得随机运动模拟器的起点

时间:2013-08-28 03:18:49

标签: python simulation

我试图创建一个运行基本模拟的程序。 创建一个十行的行,让随机数生成器选择他移动的方向,并跟踪他。 现在最后一个问题是初始位置不友好。 我想从中间开始 - 五 - 但无论我把那条线放在哪里,我都会收到错误。

以下是代码:

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。

2 个答案:

答案 0 :(得分:3)

问题与名为scope的事情有关。

简而言之,您所做的是首先在main函数中创建了一个名为“p”的变量。但是,这并不意味着您创建的其他功能将能够知道p存在。

如果我举一个例子,我认为这可能更容易理解。在right_movement的第一行,您执行p = p + 1。由于您使用p向其添加1,因此Python会查看您是否在p中分配了变量right_movement。既然你没有这样做,它就会“向上移动”一层,看看你是否在文件中分配了变量p。由于您没有在p中分配main,因此Python将放弃。

有几个解决方案。快速而肮脏的是使用一种叫做“全局”变量的东西,看起来像这样:

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函数之外的mtimesmain变量移至该文件,并确保使用global关键字让Python知道你想修改函数内部的变量,而不是暂时创建一个新变量。

然而,这不是最干净的解决方案 - using global variables因各种原因被视为不良做法。

更好的解决方案可能是跟踪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()

答案 1 :(得分:1)

您正尝试在多个函数之间共享相同的变量,而不将值作为参数传递给函数。为此,您需要使用全局变量。

这样的事情:

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

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

因此,首先需要在任何函数之外声明变量,然后在每个使用变量的函数中都需要 global 语句。