Проблема при изменении элементов вложенного списка в Python - PullRequest
0 голосов
/ 03 марта 2019

В этом коде я ожидал, что list A будет иметь то же значение, даже если я назначу его другой переменной temp, а затем выведу аргумент A с помощью функции foo.Однако, если A был скаляр, например, A=3, то значение A остается неизменным даже после вызова foo.

. Где я иду не так?Есть ли проблема в области действия переменных?Я нашел несколько связанных странных поведений списков в ответе на python , но не смог найти решение для моей проблемы.

A = [ [ 0 for i in range(3) ] for j in range(3) ]

def foo(input):

    temp= input
    temp[0][0]=12
    print(input)

print(A)
answer = foo(A)

Вывод:

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[12, 0, 0], [0, 0, 0], [0, 0, 0]]

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Пожалуйста, я использовал Deepcopy

from copy import copy, deepcopy

A = [ [ 0 for i in range(3) ] for j in range(3) ]

def foo(input):

    temp = deepcopy(input)
    temp[0][0]=12
    return temp

print('origin', A)
answer = foo(A)
print('after', A)
print('result', answer)

Результат:

origin [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
after [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
result [[12, 0, 0], [0, 0, 0], [0, 0, 0]]
0 голосов
/ 03 марта 2019

вместо ввода, используйте .copy, это сделает копию массива и назначит новые адреса для temp, то, что вы делаете, это поверхностное копирование, где temp = input, просто копирует адрес входного массива в temp,вместо того, чтобы делать копию списка.

Таким образом, вы можете либо сделать foo(A.copy()) или temp=input.copy(), но также заметить, что ввод не является хорошим именем, поскольку он уже назначен функции python, используйте что-то вроде foo_arg иличто-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...