이 문제는 scope과 관련이 있습니다.
간단히 말해서, 당신은 먼저 main
함수 내에서 "p"라는 변수를 생성했습니다. 그러나 이것이 사용자가 작성하는 다른 기능이 p
이라는 것을 알 수 있음을 의미하지는 않습니다.
예를 들어 설명하면 이해하기가 더 쉽습니다. right_movement
의 첫 번째 줄에서는 p = p + 1
을 수행합니다. p
을 사용하여 1을 더하기 때문에 파이썬은 변수 p
을 right_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
, m
및 times
변수를 이동, 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()
아주 좋은 대답. 어쩌면'times'가'main()'에 정의되어 있지만 함수에서 업데이트 된 이유 ('p'에 문제를 야기 했음)에 대해 설명 할 수 있을까요? – beroe