我试着做一个网格,从(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
将函数的返回值赋给数组。由于没有函数显式返回任何内容,因此该值为
None
。你最终会得到:Left
和所有其他方向函数只对一个副本进行操作,不返回任何内容,它们目前是无用的。你知道吗最后让我们进入
Move
函数:Direction_function[Direction]
查找列表的值,但对其不做任何处理(在代码中它们都是None
)。你知道吗现在打印在代码中没有更改的
X
和Y
全局变量的值。你知道吗你问题中的代码无效。例如,
Move()
中的Direction_functions[Direction]
没有任何有用的功能。不过我想我明白你的意思。你知道吗整数是不可变的,所以当您尝试更改1的值时,会创建一个新的值,并将结果分配给所使用的变量名。你知道吗
函数参数本质上是局部变量,因此在每个函数中
CoordinateX
或CoordinateY
只是传递给函数的值的名称。当您的函数更改此值时,它们仅在本地更改参数名称所引用的内容。你知道吗解决此问题的一种方法是在可变容器对象(如列表)中传递值,然后修改列表的内容。另一个非常常见的解决方法是使用全局变量并让函数修改这些变量。你知道吗
下面是一个工作版本的代码,它通过传递一个包含x和y坐标的列表来最小化全局变量的使用:
您试图将值设置为全局变量,而不在函数的作用域中将它们声明为
global
,而是将它们作为参数传递,在python中,这些参数是按值传递的(这意味着您不能更改原始变量)。这会导致python更改每个函数中的局部变量,使其覆盖全局变量,从而使它们的值在全局范围内保持不变。如果希望函数修改全局变量,则必须声明它们,例如:相关问题 更多 >
编程相关推荐