我正在创建一个实用程序,其功能将用作另一个程序的一部分。
这是我的功能(编辑):
def push_up (grid):
new_grid = up_down_swapper(grid)
new_grid = zero_DR(new_grid)
for i in range(4):
for j in range(3):
if new_grid[i][j] == new_grid[i][j+1]:
new_grid[i][j+1] = (new_grid[i][j])+(new_grid[i][j])
new_grid[i][j] = 0
else:
pass
new_grid = zero_DR(new_grid)
grid = up_down_swapper(new_grid)
#print(grid) - shows the grid as the expected outcome. But outside of the function it doesn't change
以下是它的使用方法:
push.push_up (grid)
正如你们所知,它并没有被赋予像
这样的价值new_grid = push.push_up (grid)
我无法更改主程序(这是一项任务,这是我被告知要做的事情。)
我的问题是如何让函数更改参数的值?我不确定我是否有意义但是这样的事情:
def square(x):
x = x*x
value = 3
square(value)
print(value)
这将输出3,但我想要9.我将如何做到这一点?
这是主代码的pastebin: http://pastebin.com/NAxWL14h
答案 0 :(得分:1)
简短的回答是,由于Python传递参数的方式,你不能这样做。对于square
示例,如果不将value
的结果分配给square(value)
,则无法更改grid
的值。
但是,您无需更改for i in range(4): #add numbers that are equal
for j in range(3,-1,-1):
if grid[i][j] == grid[i][j-1]:
grid[i][j-1] = (grid[i][j])+(grid[i][j])
grid[i][j] = 0
else:
pass
指向的内容。部分代码
grid
您正在更改>>> list_to_add_to = []
>>> def add_to_list(a_list):
... a_list.append('test')
...
>>> print(list_to_add_to)
[]
>>> add_to_list(list_to_add_to)
>>> print(list_to_add_to)
['test']
中的值。所以这样考虑一下:
list_to_add_to
我没有更改grid
引用的内容,但我仍然可以修改它。这被称为“就地修改”。
因此,您不必尝试创建新的grid
并返回该结果,而是有两种选择:
grid
new_grid
(称之为new_grid
之类的其他内容)并使用它。然后在功能结束时,将grid
中的所有内容复制到{{1}}。答案 1 :(得分:0)
之间存在差异
第一个完成了作业:
a = []
b = a
b = [3]
print(a) # still prints []
第二个只能用可变对象(例如,列表没问题,没有元组):
a = []
b = a
b.append(3)
print(a) # prints [3]
当你进行函数调用时,你基本上都是这样做的:
def f(b):
b = [3]
仅更改b
指向函数内部的内容。
然而,
def g(b):
b.append(3)
更改调用者提供的list
对象。
确切地说,这就是要点:作业中的功能应该就地修改grid
。而是为它分配一个不同的对象,它不会传播回调用者。