【问题标题】:Outcome of Function - Python函数的结果 - Python
【发布时间】:2014-06-19 17:13:44
【问题描述】:

我正在创建一个实用程序,其功能将用作另一个程序的一部分。

这是我的功能(已编辑):

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

【问题讨论】:

  • ...您似乎正在就地修改grid。究竟是什么问题?
  • 我认为这是一个范围问题。见相关文章:stackoverflow.com/questions/370357/…
  • 我的问题是“网格”在函数之外没有改变。我已编辑问题以显示新代码。

标签: python arrays list function python-3.x


【解决方案1】:

简短的回答是,由于 Python 传递参数的方式,您不能这样做。对于您的 square 示例,如果不将 square(value) 的结果分配给它,就无法更改 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

【讨论】:

  • 我已经尝试了这两个选项,但我没有在函数之外的“网格”中得到改变。我已经在原始帖子中展示了这一点
  • @Itachi Saying grid = up_down_swapper(new_grid) 不会将任何内容复制到 gridgrid[i][j] = new_grid[i][j] 确实如此。
【解决方案2】:

有区别

  • 有一个名字是指不同的值/对象和
  • 修改名称所指的对象。

第一个任务完成了:

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。相反,您为其分配了一个不同的对象,该对象不会传播回调用者。

【讨论】:

  • 我将如何就地修改网格?
  • @Itachi 通过分配给某些索引位置,例如grid[i][j] = 123,就像你已经做的那样,或者通过e。 G。 grid.append(123) 增加大小。只要您执行new_grid = some_operation(grid),与“原始”的连接就会丢失。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多