Python: deepcopy (список) по сравнению с new_list = old_list [:]

Я делаю упражнение № 9 из http://openbookproject.net/thinkcs/python/english2e/ch09.html и имею, столкнулся с чем-то, что не имеет смысла.

Осуществление предлагает использовать copy.deepcopy() для создания моей задачи легче, но я не вижу, как она могла.

def add_row(matrix):
    """
        >>> m = [[0, 0], [0, 0]]
        >>> add_row(m)
        [[0, 0], [0, 0], [0, 0]]
        >>> n = [[3, 2, 5], [1, 4, 7]]
        >>> add_row(n)
        [[3, 2, 5], [1, 4, 7], [0, 0, 0]]
        >>> n
        [[3, 2, 5], [1, 4, 7]]
    """

    import copy
    # final = copy.deepcopy(matrix)  # first way
    final = matrix[:]                # second way
    li = []
    for i in range(len(matrix[0])):
        li.append(0)
    # return final.append(li)  # why doesn't this work?
    final.append(li)            # but this does
    return final

Я смущен, почему книга предлагает использовать deepcopy() когда простое list[:] копии это. Я использую его неправильно? Моя функция полностью из ненормального?

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

TIA

13
задан SilentGhost 25 June 2010 в 17:26
поделиться

2 ответа

Вы задали два вопроса:

Глубокая или неглубокая копия

матрица [:] - это мелкая копия - она ​​копирует только элементы непосредственно хранится в нем и не дублирует рекурсивно элементы массивов или других ссылок внутри себя. Это означает:

a = [[4]]
b = a[:]
a[0].append(5)
print b[0] # Outputs [4, 5], as a[0] and b[0] point to the same array

То же самое произойдет, если вы сохраните объект в a .

deepcopy () , естественно, является глубокой копией - он рекурсивно копирует каждый из своих элементов на всем пути вниз по дереву:

a = [[4]]
c = copy.deepcopy(a)
a[0].append(5)
print c[0] # Outputs [4], as c[0] is a copy of the elements of a[0] into a new array

Возвращение

return final .append (li) отличается от вызова append и возврата final , потому что list.append не возвращает сам объект списка, он возвращает None

23
ответ дан 1 December 2019 в 21:36
поделиться

См. Документацию о глубоком и поверхностном копировании .

list[:]

не создает копии вложенных элементов.

Что касается вашей проблемы с оператором return, похоже, что вы не находитесь внутри функции, когда вы ее вызываете, я предполагаю, что это произошло при вставке кода сюда. Что касается возвращаемого значения, Майкл Мрозек прав.

2
ответ дан 1 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: