为什么这个程序不会改变整数的值?

时间:2015-05-24 16:54:10

标签: python

我正在尝试制作一个网格,从(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

3 个答案:

答案 0 :(得分:1)

您正在尝试将值设置为全局变量,而不是在函数范围内将它们声明为global,而是将它们作为参数传递,这些参数在python中通过值传递(意味着您不能这样做)改变原始变量)。这会导致python更改每个函数中的局部变量,这些变量会掩盖全局变量,从而导致它们的值在全局范围内保持不变。如果希望函数修改全局变量,则必须声明它们,例如:

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

答案 1 :(得分: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个全局变量的值。

答案 2 :(得分:0)

您问题中的代码无效。例如,Direction_functions[Direction]中的Move()并没有做任何有用的事情。但是我想我明白你在问什么。

整数是不可变的,因此当您尝试更改1的值时,将创建一个新值,并将结果分配给正在使用的变量名。

函数参数本质上是局部变量,因此在每个函数中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.")