питон; изменение исходного списка в функции - PullRequest
0 голосов
/ 27 февраля 2020

В моей функции мне нужно изменить значение элемента в списке на значение по умолчанию (10) без изменения исходного списка.

function(orig_list):

dup_list = list(orig_list)

#Setting the appropriate value for the list but don't want to change the original list. 
for i in dup_list:
    if dup_list[dup_list.index(i)][1] == 11 or dup_list[dup_list.index(i)][1] == 12 or dup_list[dup_list.index(i)][1] == 13:
        dup_list[dup_list.index(i)][1] = 10

Однако, когда я позже вызываю функцию в своем коде и печатаю исходный список, она также меняется. Я хочу, чтобы функция выполняла эту операцию и давала мне значение, но не меняла исходный список.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Существуют разные способы копирования изменяемых структур данных, таких как списки и словари. Полные копии работают, если есть только неизменяемые элементы, но если у вас есть список, например, внутри списка, вам нужна глубокая копия.

Для иллюстрации:

from copy import deepcopy

l = [1,['a', 'b', 'c'],3,4]
l2 = list(l)
l3 = l.copy()
l4 = deepcopy(l)


# Mutate original list
l[0] = 10  # All of the copies are unaffected by this.
l[1][0] = 'f' # All of the copies except for the deep copy are affected by mutating a mutable item inside the shallow copy of the list.

print(l, l2, l3, l4)

# Result:
# [10, ['f', 'b', 'c'], 3, 4] [1, ['f', 'b', 'c'], 3, 4] [1, ['f', 'b', 'c'], 3, 4] [1, ['a', 'b', 'c'], 3, 4]
0 голосов
/ 27 февраля 2020

Если вам не разрешено импортировать что-либо для глубокого копирования списка, вы можете сделать это самостоятельно с помощью простой рекурсивной функции. В моем примере ниже предполагается, что ваш список состоит только из неизменяемых элементов (float, int, str, tuple и т. Д. c) и списков из них. Например, он не будет глубоко копировать словарь (но вы могли бы добавить это):

old = [[1, 2,3], [3, 4,[2, 3, 4], 2, [1,2]]]


def deep_copy_list(inlist):
   results = []
   for item in inlist:
       if type(item) != list:     # item is not a list so just append to results
           results.append(item)
       else:
           results.append(deep_copy_list(item))  # item is a list so append a copy
   return results

new = deep_copy_list(old)

print("id of element 0 of old is", id(old[0]))
print("id of element 0 of new is", id(new[0]))

id of element 0 of old is 136833800
id of element 0 of new is 151480776

(операторы print просто показывают, что (например) список в элементе 0 старого списка имеет была скопирована в новый список с новым значением идентификатора.)

Затем, получив новый список, представляющий собой глубокую копию исходного списка, вы можете изменить исходный список, как в предыдущих решениях

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