函数的输出 - Python

0 投票
2 回答
961 浏览
提问于 2025-04-18 05:11

我正在创建一个工具程序,它的功能将作为另一个程序的一部分使用。

这是我的函数(已编辑):

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并返回结果,你有两个选择:

  1. 修改grid的内容
  2. 创建一个新的grid(可以叫它new_grid)并用这个新的。然后在函数结束时,把new_grid里的所有内容复制到grid里。

撰写回答