Разница между a [:] = b и a = b [:]?(Python) - PullRequest
8 голосов
/ 12 августа 2011

Меня попросили пройти тест на кодирование, и я не знал ответа.У кого-нибудь есть идеи?

Ответы [ 3 ]

8 голосов
/ 12 августа 2011

[:] - оператор среза.

Когда он находится слева, он перезаписывает содержимое списка без создания новой ссылки.

Когда он справа, он создает копию списка с тем же содержимым..

2 голосов
/ 12 августа 2011

a = b[:] вызывает либо __getslice__ или __getitem__ при b и присваивает результат a.Почти во всех случаях (например, списки, кортежи и другие типы последовательностей) это делает поверхностную копию последовательности;Я не знаю ни одного класса, который бы не реализовывал это поведение, но у вас мог быть пользовательский тип, который делал что-то другое.Любые другие объекты, которые ранее ссылались на старое значение a, будут продолжать ссылаться на это старое значение.

a[:] = b, с другой стороны, вызывает __setslice__ или __setitem__ для замены подмножества элементов a элементами последовательности b.В этом случае, если тип последовательности a хорошо себя ведет, это заменит все значение a, поскольку диапазон : без конечных точек указывает всю последовательность.Разница здесь в том, что неизменяемые типы, такие как кортежи, не позволят вам выполнить __setslice__ (например, с помощью исключения TypeError).Любые другие объекты, которые ранее ссылались на a, также будут обновлены, поскольку базовый объект изменяется.

Для изменяемых типов, таких как list, результат a = b[:] будет идентичен a[:] = b, в этом a будет мелкой копией b;для неизменяемых типов, таких как tuple, a[:] = b недопустимо.Для плохо определяемых пользователем типов все ставки отключены.Существует также разница в том, что происходит с другими объектами, которые ссылаются на тот же объект, что и a - с a = b[:] они ссылаются на исходное значение (a), но с a[:] = b они ссылаются на измененныйобъект (мелкая копия b).

1 голос
/ 12 августа 2011

В обоих случаях вы получите список a, являющийся копией списка b. Но метод, используемый для достижения этой цели, изменился.

a[:] = b изменяет список a, чтобы он содержал те же элементы, что и b

a = b[:] создает новый список, который является копией b и заменяет список a

Разница в том, изменили ли мы существующий список или создали новый.

Чтобы увидеть разницу:

a = range(3)
b = range(4)
c = a # c and a now share the same list
a[:] = b
print "a", a
print "b", b
print "C", c

Все три списка будут распечатаны одинаково. C и совместно используют один и тот же объект, поэтому, когда a был изменен, изменился и c

a = range(3)
b = range(4)
c = a # c and a now share the same list
a = b[:]
print "a", a
print "b", b
print "C", c

Теперь c не будет печатать так же, как a. После назначения a и c не использовали один и тот же объект.

Скорость, a[:] = b' is probably a little faster then a = b [:] `. Первая форма не должна создавать новый объект списка, она может просто изменить существующий список. Большая часть этого заключается в том, что он может повторно использовать память, уже принадлежащую списку, а не выделять новую память.

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