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

2024-09-28 21:51:37 发布

您现在位置: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

Tags: moveifdeffunctionselseintfailstr
3条回答
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全局变量的值。你知道吗

你问题中的代码无效。例如,Move()中的Direction_functions[Direction]没有任何有用的功能。不过我想我明白你的意思。你知道吗

整数是不可变的,所以当您尝试更改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.")

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

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

相关问题 更多 >