Python - Function有一个列表作为参数.如何返回另一个列表而不更改第一个?

Rou*_*mar 2 python return-value function-declaration

我是Python的新手(和整个编程).我很确定答案很明显,但我真的不知道该怎么做.

def do_play(value, slot, board):
    temp=board
    (i,j) = slot
    temp[i][j] = value
    return temp
Run Code Online (Sandbox Code Playgroud)

board是列表.value是一个整数.slot是和整数元组.

我想在这里做的是

  • 喂功能板
  • 将电路板复制到名为temp的新列表中
  • 在temp中的特定位置插入新值
  • 返回温度,让电路板保持不变

当我运行它是shell时,原始列表(板)和新列表(temp)都会发生变化.=

任何帮助,将不胜感激.

unu*_*tbu 10

temp=board不会成为新的董事会.它使temp变量引用与列表完全相同board.所以也要改变temp[i][j]变化board[i][j].

要制作副本,请使用

import copy
temp=copy.deepcopy(board)
Run Code Online (Sandbox Code Playgroud)

请注意,temp=board[:]make temp引用一个新列表(不同于board,但内容(即列表中的列表)仍然相同:

In [158]: board=[[1,2],[3,4]]    
In [159]: temp=board[:]    
Run Code Online (Sandbox Code Playgroud)

修改也会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]]
Run Code Online (Sandbox Code Playgroud)

id显示对象的内存地址.这显示temp并且board是不同的列表:

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

In [173]: id(board)
Out[173]: 178068780   # The ids don't match
Run Code Online (Sandbox Code Playgroud)

但这显示内部的第二个列表temp是内部相同的列表board:

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

In [175]: id(board[1])
Out[175]: 178827948    # The ids are the same
Run Code Online (Sandbox Code Playgroud)

但是如果你使用copy.deepcopy,那么列表中的列表也会被复制,如果修改tempboard保持不变,你需要的是:

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]]
Run Code Online (Sandbox Code Playgroud)


S.L*_*ott 5

你想复制board吗?

temp = board[:]
Run Code Online (Sandbox Code Playgroud)

或者这可能是复制结构.

temp = [ r[:] for r in board ]
Run Code Online (Sandbox Code Playgroud)

  • 这只会复制顶级.似乎`board`是一个列表,它基于对`temp`执行的索引进一步向下几行. (2认同)