我试图创建一个运行基本模拟的程序。 创建一个十行的行,让随机数生成器选择他移动的方向,并跟踪他。 现在最后一个问题是初始位置不友好。 我想从中间开始 - 五 - 但无论我把那条线放在哪里,我都会收到错误。
以下是代码:
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。
答案 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
函数之外的m
,times
和main
变量移至该文件,并确保使用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 语句。