Python - 函数有一个列表作为参数。如何返回另一个列表而不更改第一个?
我在Python中很新(并且作为一个整体编程)。我很确定这个答案很明显,但我真的不知道该怎么做。Python - 函数有一个列表作为参数。如何返回另一个列表而不更改第一个?
def do_play(value, slot, board):
temp=board
(i,j) = slot
temp[i][j] = value
return temp
板是列表的列表。值是一个整数。槽是整数元组。
我想在这里做的是
- 饲料功能板
- 抄板到所谓的气温
- 新名单中临时插入一个特定位置的新值
- 返回温度,离开电路板不变
当我运行这个是shell,原始列表(板)和新列表(温度)改变。 = \
任何帮助,将不胜感激。
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
显示对象的内存地址。这表明temp
和board
是不同的列表:
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]]
您是否想复制board
?
temp = board[:]
也许这可以复制结构。
temp = [ r[:] for r in board ]
这只会复制顶层。看起来'board'是一个列表列表,它基于进一步下行的'temp'上执行的索引。 – 2010-10-19 02:55:09
这里temp
是参考board
,一个浅拷贝。我通常喜欢导入复制模块(import copy
)并使用copy.deepcopy
,这使temp
与板分离。你会这样说:
import copy
temp = copy.deepcopy(board)
否则,你可以做一个董事会(这也使深层复制)。我相信这应该起作用,但是我没有在列表中尝试过。你会这么称呼它:
temp = board[:]
'[:]'操作员不会进行深层复制。你的第一个选择是正确的。 – aaronasterling 2010-10-19 02:56:42
谢谢!我非常喜欢用切片进行猜测。 – jlv 2010-10-19 03:00:23
这将有助于查看程序的其余部分。 – 2010-10-19 02:48:35
欢迎来到Python。快速提示:'(i,j)= slot'中'i,j'附近的括号不是必需的。 – 2010-10-19 02:51:15
谢谢您的建议和欢迎。 – Roughmar 2010-10-20 13:56:41