我正在尝试制作一个网格,从(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
答案 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
。)
现在,您可以打印代码中无处更改的X
和Y
个全局变量的值。
答案 2 :(得分:0)
您问题中的代码无效。例如,Direction_functions[Direction]
中的Move()
并没有做任何有用的事情。但是我想我明白你在问什么。
整数是不可变的,因此当您尝试更改1的值时,将创建一个新值,并将结果分配给正在使用的变量名。
函数参数本质上是局部变量,因此在每个函数中CoordinateX
或CoordinateY
只是传递函数的值的名称。当您的函数更改此值时,它们仅在本地更改参数名称引用的内容。
解决此问题的一种方法是将值传递到可变容器对象(如列表)中,然后修改列表的内容。另一种常见的解决方法是使用全局变量并使用函数修改它们。
这是您的代码的工作版本,它通过传递带有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.")