Python: deepcopy (list) vs new_list = old_list

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

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

  • копировать несколько файлов в python
  • Как я могу узнать, создает ли NumPy представление или копию?
  • python копирует файлы в сетевое расположение в Windows без сопоставления диска
  • Глубоко скопировать список в Python
  • Python: Numpy __deepcopy__ TypeError
  • Почему shutil.copy () вызывает исключение разрешения, если cp не работает?
  •  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[:] копирует его. Я использую это неправильно? Является ли моя функция полностью неаккуратной?

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

    ТИА

  • Показать все возможные группировки списка, учитывая только количество подписок (длины являются переменными)
  • Как мне перебирать список Python по двум?
  • Удаление элементов с последовательными обманами
  • Как переопределить функциональность среза списка в его производном классе
  • Самая длинная расширяющаяся уникальная подпоследовательность
  • два списка для Json Format в python
  • 2 Solutions collect form web for “Python: deepcopy (list) vs new_list = old_list”

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

    Глубокая и мелкая копия

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

     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

    См. Документацию по глубокой и мелкой копии .

     list[:] 

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

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

    Python - лучший язык программирования в мире.