Я делаю упражнение № 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
Вы задали два вопроса:
матрица [:]
- это мелкая копия - она копирует только элементы непосредственно хранится в нем и не дублирует рекурсивно элементы массивов или других ссылок внутри себя. Это означает:
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, похоже, что вы не находитесь внутри функции, когда вы ее вызываете, я предполагаю, что это произошло при вставке кода сюда. Что касается возвращаемого значения, Майкл Мрозек прав.