Python - функция имеет список в качестве аргумента.Как вернуть другой список без изменения первого? - PullRequest
2 голосов
/ 19 октября 2010

Я довольно новый в Python (и программировании в целом).Я почти уверен, что ответ на этот вопрос очевиден, но я действительно не знаю, что делать. Доска объявлений

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

представляет собой список списков.значение является целым числомслот и целочисленный кортеж.

Я пытаюсь здесь сделать следующее:

  • передать функциональную плату
  • копировать плату в новый список с именем temp
  • вставка нового значения в определенное место в temp
  • return temp, оставляя доску без изменений

Когда я запускаю эту оболочку, оба исходных списка (доска) и новый список (темп) изменить.= \

Любая помощь будет оценена.

Ответы [ 5 ]

10 голосов
/ 19 октября 2010

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]]
5 голосов
/ 19 октября 2010

Вы пытаетесь скопировать board?

temp = board[:]

Или, может быть, это скопировать структуру.

temp = [ r[:] for r in board ]
2 голосов
/ 19 октября 2010

Здесь temp является ссылкой на board, мелкую копию. Я обычно люблю импортировать модуль копирования (import copy) и использовать copy.deepcopy, что делает temp отдельным от платы. Вы бы назвали это примерно так:

import copy
temp = copy.deepcopy(board)

В противном случае вы можете просто сделать кусок доски (который также делает глубокую копию). Я считаю, что это должно работать, но я не пробовал это в списке списков. Вы бы назвали это так:

temp = board[:]
2 голосов
/ 19 октября 2010

Используйте copy.deepcopy() для копирования объекта.

0 голосов
/ 19 октября 2010
temp=board

Это не копирует список, он просто делает еще одну ссылку на тот же объект.Вместо этого используйте temp = board[:].

...