2013-08-28 1 views
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을 넣어 상관없이, 내가 그 참조에 오류가 발생합니다 :

여기에 코드입니다. 저는 파이썬 2.7을 사용하고 있습니다.

답변

1

함수에 값을 인수로 전달하지 않고 여러 함수간에 동일한 변수를 공유하려고합니다. 이를 수행하려면 번 글로벌 변수를 사용해야합니다. 이 같은

뭔가 :

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

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

그래서, 먼저, 어떤 함수 외부 변수를 선언 할 필요는 당신이 필요로하는 변수를 사용하여 각 기능에 글로벌 문이.

3

이 문제는 scope과 관련이 있습니다.

간단히 말해서, 당신은 먼저 main 함수 내에서 "p"라는 변수를 생성했습니다. 그러나 이것이 사용자가 작성하는 다른 기능이 p이라는 것을 알 수 있음을 의미하지는 않습니다.

예를 들어 설명하면 이해하기가 더 쉽습니다. right_movement의 첫 번째 줄에서는 p = p + 1을 수행합니다. p을 사용하여 1을 더하기 때문에 파이썬은 변수 pright_movement 내에 할당했는지 확인하려고합니다. 당신이하지 않았기 때문에, 레이어를 "위로 이동"하고 파일 내에 일반적으로 p 변수를 할당했는지 확인합니다. main 안에 할당 된 것 중 하나에 p을 할당하지 않았기 때문에, 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() 

당신은 파일에 main 기능의 외부 p, mtimes 변수를 이동, global 키워드를 사용하여 함수 내에서 변수를 수정하고 일시적으로 새 변수를 작성하는 대신 파이썬에 알려 주도록하십시오.

그러나이 방법이 가장 깨끗한 해결책은 아닙니다. 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() 
+0

아주 좋은 대답. 어쩌면'times'가'main()'에 정의되어 있지만 함수에서 업데이트 된 이유 ('p'에 문제를 야기 했음)에 대해 설명 할 수 있을까요? – beroe

관련 문제