函数的输出 - Python
我正在创建一个工具程序,它的功能将作为另一个程序的一部分使用。
这是我的函数(已编辑):
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。我该如何实现这个目标呢?
这是主代码的链接: http://pastebin.com/NAxWL14h
2 个回答
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,而不是给它赋一个新的对象,这样就不会影响到调用者。
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
里。