2

我是 Python 的新手(以及整个编程)。我很确定这个问题的答案是显而易见的,但我真的不知道该怎么做。

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

board 是列表的列表。值是一个整数。插槽是和整数元组。

我在这里要做的是

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

当我运行这是 shell 时,原始列表(板)和新列表(临时)都发生了变化。= \

任何帮助,将不胜感激。

4

5 回答 5

10

temp=board不做一个新的董事会。它使temp变量引用的列表与board. 所以改变temp[i][j]也改变board[i][j]

要制作副本,请使用

import copy
temp=copy.deepcopy(board)

请注意,temp=board[:]maketemp引用了一个新列表(不同于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,这就是你需要的: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]]
于 2010-10-19T02:49:21.403 回答
5

你想复制board吗?

temp = board[:]

或者这可能是为了复制结构。

temp = [ r[:] for r in board ]
于 2010-10-19T02:48:59.797 回答
2

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

于 2010-10-19T02:48:31.900 回答
2

temp是对 的引用board,浅拷贝。我通常喜欢导入复制模块(import copy)并使用copy.deepcopytemp与板分开。你可以这样称呼它:

import copy
temp = copy.deepcopy(board)

否则,您可以只制作一块木板(也可以制作深拷贝)。我相信这应该可行,但我还没有在列表列表中尝试过。你会这样称呼它:

temp = board[:]
于 2010-10-19T02:51:03.733 回答
0
temp=board

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

于 2010-10-19T02:50:27.930 回答