2010-10-19 119 views
2

我在Python中很新(并且作为一个整体编程)。我很确定这个答案很明显,但我真的不知道该怎么做。Python - 函数有一个列表作为参数。如何返回另一个列表而不更改第一个?

def do_play(value, slot, board): 
    temp=board 
    (i,j) = slot 
    temp[i][j] = value 
    return temp 

板是列表的列表。值是一个整数。槽是整数元组。

我想在这里做的是

  • 饲料功能板
  • 抄板到所谓的气温
  • 新名单中临时插入一个特定位置的新值
  • 返回温度,离开电路板不变

当我运行这个是shell,原始列表(板)和新列表(温度)改变。 = \

任何帮助,将不胜感激。

+0

这将有助于查看程序的其余部分。 – 2010-10-19 02:48:35

+2

欢迎来到Python。快速提示:'(i,j)= slot'中'i,j'附近的括号不是必需的。 – 2010-10-19 02:51:15

+0

谢谢您的建议和欢迎。 – Roughmar 2010-10-20 13:56:41

回答

10

temp=board不会成为新的董事会。它使temp变量引用与board的列表非常相似。所以改变temp[i][j]也改变了board[i][j]

进行复印,使用

import copy 
temp=copy.deepcopy(board) 

注意temp=board[:]使得temp是指一个新的列表(比board不同,但内容(即在列表中的列表)仍相同:

In [158]: board=[[1,2],[3,4]]  
In [159]: temp=board[:]  

修改temp修改board太:

In [161]: temp[1][0]=100  
In [162]: temp 
Out[162]: [[1, 2], [100, 4]]  
In [163]: board 
Out[163]: [[1, 2], [100, 4]] 

id显示对象的内存地址。这表明tempboard是不同的列表:

In [172]: id(temp) 
Out[172]: 176446508 

In [173]: id(board) 
Out[173]: 178068780 # The ids don't match 

但是,这表明里面temp第二个列表里面board非常相同的列表:

In [174]: id(temp[1]) 
Out[174]: 178827948 

In [175]: id(board[1]) 
Out[175]: 178827948 # The ids are the same 

但是如果你使用copy.deepcopy,那么列表中的列表也会被复制,如果修改temp将使board保持不变,则这就是您需要的内容:

In [164]: import copy  
In [165]: board=[[1,2],[3,4]]  
In [166]: temp=copy.deepcopy(board)  
In [167]: temp[1][0]=100  
In [168]: temp 
Out[168]: [[1, 2], [100, 4]]  
In [169]: board 
Out[169]: [[1, 2], [3, 4]] 
2

使用copy.deepcopy()复制对象。

+1

+1用于链接到标准库文档。 – Wogan 2010-10-19 03:09:02

5

您是否想复制board

temp = board[:] 

也许这可以复制结构。

temp = [ r[:] for r in board ] 
+2

这只会复制顶层。看起来'board'是一个列表列表,它基于进一步下行的'temp'上执行的索引。 – 2010-10-19 02:55:09

0
temp=board 

这不会复制列表,它只是使一个更reference同一个对象。改为使用temp = board[:]

2

这里temp是参考board,一个浅拷贝。我通常喜欢导入复制模块(import copy)并使用copy.deepcopy,这使temp与板分离。你会这样说:

import copy 
temp = copy.deepcopy(board) 

否则,你可以做一个董事会(这也使深层复制)。我相信这应该起作用,但是我没有在列表中尝试过。你会这么称呼它:

temp = board[:] 
+0

'[:]'操作员不会进行深层复制。你的第一个选择是正确的。 – aaronasterling 2010-10-19 02:56:42

+0

谢谢!我非常喜欢用切片进行猜测。 – jlv 2010-10-19 03:00:23

相关问题