输入参数更改为循环调用另一个def(python 3.0),为什么?

时间:2016-10-21 10:28:41

标签: python list loops

我无法弄清楚为什么我的输入参数(电路板)在循环中发生了变化..

def iterate从def init中获取列表“board”。它应该这样做一次,我检查过,它只是调用def启动一次。问题发生在循环“for i in range(0,size()):”in def iterate。这里,列表“old_board”以某种方式改变。如果我在列表“old_board”中有5轮和5个列表,则第二轮更改old_board [1]的值,依此类推。为什么会发生这种情况?我该如何解决?

(循环中的参数列表和列表应该相等)

这是输出:

“这是参数列表:[[1,1,0,1,0],[1,1,1,0,1],[0,0,1,1,1],[1, 1,0,1,1],[1,0,0,1,0]]

这是循环中的列表:[[1,1,0,1,0],[1,1,1,0,1],[0,0,1,1,1],[1] ,1,0,1,1],[1,0,0,1,0]]

这是循环中的列表:[[0,0,0,1,0],[1,1,1,0,1],[0,0,1,1,1],[1 ,1,0,1,1],[1,0,0,1,0]]

这是循环中的列表:[[0,0,0,1,0],[1,1,0,0,0],[0,0,1,1,1],[1 ,1,0,1,1],[1,0,0,1,0]]

这是循环中的列表:[[0,0,0,1,0],[1,1,0,0,0],[0,0,0,1,0],[1 ,1,0,1,1],[1,0,0,1,0]]

这是循环中的列表:[[0,0,0,1,0],[1,1,0,0,0],[0,0,0,1,0],[1 ,1,0,1,0],[1,0,0,1,0]]“

这是代码:

def iterate(board):
    old_board = board
    print('This is the parameter list  :',old_board)
    new_board = board                                       
    living = 0                                                  # Value of alive cells in the future new board

    for i in range(0,size()):                                # Nestled loop that iterate through the old board
        print('This is the list in the loop:',old_board)
        for j in range(0,size()):                            # and sets new values depending on the status of each old cell
            new_value = living_neighbors(i,j,old_board)[1]
            new_board[i][j] = new_value
            living += new_value
    print(new_board)
    print(living) 

    return (living, new_board)
iterate(initiate()[0])

2 个答案:

答案 0 :(得分:1)

在这里,您不复制列表,只需创建一个指向现有列表的新链接

old_board = board
print('This is the parameter list  :',old_board)
new_board = board   

如果你需要它的副本,你应该这样做:

old_board = board[:]
print('This is the parameter list  :',old_board)
new_board = board[:]   

请参阅FAQ

答案 1 :(得分:0)

通过这样做

old_board = board
new_board = board 

您不会创建新对象,而只会创建对现有对象的新引用。 您可以使用复制模块或Alex建议的语法来创建新对象。

from copy import deepcopy
old_board = deepcopy(board)

您可在此处找到详细说明: http://www.python-course.eu/deep_copy.php