2015-05-24 62 views
-5

我試圖做一個網格,從(0,0),每個不同的功能,改變了你的價值,這是代碼:這個程序爲什麼不改變一個整數的值?

X = 0 
Y = 0 
MaximumX = 5 
MinimumX = -5 
MaximumY = 5 
MinimumY = -5 

def Move(Direction): 
    Direction_functions[Direction] 
    print (str(X),",",str(Y)) 

def Left(CoordinateX): 
    if CoordinateX != MinimumX: 
     CoordinateX -= 1 
    else: 
     Fail() 

def Right(CoordinateX): 
    if CoordinateX != MaximumX: 
     CoordinateX += 1 
    else: 
     Fail() 

def Up(CoordinateY): 
    if CoordinateY != MinimumY: 
     CoordinateY -=1 
    else: 
     Fail() 

def Down(CoordinateY): 
    if CoordinateY != MaximumY: 
     CoordinateY += 1 
    else: 
     Fail() 

def Fail(): 
    print ("Failure\n", str(X),",",str(Y)) 

Direction_functions = [Left(int(X)), Right(int(X)), Up(int(Y)), Down(int(Y))] 

while True: 
    Number = input("") 
    Move(int(Number)) #Infinite loop is for testing purposes 

這是試圖向左移動後的輸出:

>>> ================================ RESTART ================================ 
>>> 
1 
0 , 0 
1 
0 , 0 
1 
0 , 0 
1 
0 , 0 
1 
0 , 0 
1 
0 , 0 
1 
0 , 0 
+6

而不是發佈垃圾文本,你可以解釋你期望的輸出。 –

+1

此外,您的路線數組包含值,而不是函數(當數組初始化時函數只調用一次)。如果你想要一個函數數組,它看起來像'Direction_functions = [Left,Right,Up,Down]' –

回答

1

您正試圖設置值,以全局變量沒有聲明因爲global在你的函數範圍內,而是將它們作爲參數傳遞,這些參數在python中是按值傳遞的(意思是你不能改變原始變量)。這會導致python更改每個函數內的局部變量,這些局部變量會遮蓋全局變量,導致其值在全局範圍內保持不變。如果你希望你的函數來修改全局變量,你必須聲明它們的話,例如:

def Left(): 
    global CoordinateX 
    if CoordinateX != MinimumX: 
     CoordinateX -= 1 
    else: 
     Fail() 
0

您問題中的代碼無效。例如Move()中的Direction_functions[Direction]不起任何作用。不過,我想我明白你在問什麼。

整數是不可變的,所以當您嘗試更改一個值時,會創建一個新值,並將結果分配給正在使用的變量名稱。

函數參數本質上是局部變量,所以在每個函數中,CoordinateXCoordinateY只是您傳遞函數的值的名稱。當你的函數改變這個值時,它們只是在本地改變參數名稱引用的內容。

解決此問題的一種方法是將值傳遞給可變容器對象,如列表,然後修改列表的內容。另一個很常見的解決方法是使用全局變量並使函數修改這些變量。

這是你的代碼的工作版本,通過傳遞列表與x和y使用全局變量的減少座標是:

X, Y = 0, 1 
MINIMUM_X, MAXIMUM_X = -5, 5 
MINIMUM_Y, MAXIMUM_Y = -5, 5 

def Move(Direction, position): 
    DIRECTION_FUNCTIONS[Direction](position) 
    print('{}, {}'.format(*position)) 

def Left(position): 
    if position[X] > MINIMUM_X: 
     position[X] -= 1 
    else: 
     Fail(position) 

def Right(position): 
    if position[X] < MAXIMUM_X: 
     position[X] += 1 
    else: 
     Fail(position) 

def Up(position): 
    if position[Y] > MINIMUM_Y: 
     position[Y] -= 1 
    else: 
     Fail(position) 

def Down(position): 
    if position[Y] < MAXIMUM_Y: 
     position[Y] += 1 
    else: 
     Fail(position) 

def Fail(position): 
    print('Failure\n{}, {}'.format(*position)) 

DIRECTION_FUNCTIONS = [Left, Right, Up, Down] 

location = [0, 0] 
while True: # Infinite loop for testing purposes 
    Number = input("enter a number from 0 to 3: ") 
    direction = int(Number) 
    if 0 <= direction <= 3: 
     Move(direction, location) 
    else: 
     print("Input out of range, try again.") 
1
Direction_functions = [Left(int(X)), Right(int(X)), Up(int(Y)), Down(int(Y))] 

您指定的函數的返回值到一個數組。由於沒有任何函數明確返回任何內容,因此該值爲None。你結束了:

Direction_functions = [None, None, None, None] 

Left和所有其他方向的功能只在副本上操作,不返回任何東西,他們是無用的,因爲他們的時刻。

def Left(CoordinateX): # the parameter is a copy, you don't change anything. 
    if CoordinateX != MinimumX: 
     CoordinateX -= 1 
    else: 
     Fail() 

最後讓我們得到您Move功能:

def Move(Direction): 
    Direction_functions[Direction] 
    print (str(X),",",str(Y)) 

Direction_function[Direction]查找列表的價值,無助於它(他們都是None反正在你的代碼)。

現在,您可以打印代碼中無處改變的全局變量XY的值。

相關問題