0

我正在尝试创建一个运行基本模拟的程序。创建一排十个盒子,让随机数发生器选择他移动的方向,并跟踪他。最近一段时间的问题是初始位置不友好。我想从中间开始——五个——但无论我把那条线放在哪里,我都会出错。

这是代码:

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。由于您使用p向其添加 1,Python 将查看您是否已pright_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移到m文件中,并确保使用关键字让 Python 知道您要修改函数内部的变量,而不是临时创建一个新变量。timesmainglobal

然而,这不是最干净的解决方案——由于各种原因,使用全局变量被认为是不好的做法。

更好的解决方案可能是跟踪 中的状态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 回答