Добавление строки в список - PullRequest
8 голосов
/ 30 ноября 2011
>>> b = []
>>> c = '1234'
>>> b += c
>>> b
['1', '2', '3', '4']
>>> 

Что здесь происходит? Это не должно работать, верно? или я что-то упускаю очевидное?

>>> b = []
>>> c = '1234'
>>> b + c
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    b + c
TypeError: can only concatenate list (not "str") to list
>>> 

Тогда a += b не всегда эквивалентно a = a + b?

Ответы [ 7 ]

14 голосов
/ 30 ноября 2011

Строки являются итеративными: элементы являются символами строки. При добавлении итерируемого в список элементы итерируемого элемента добавляются в список.

Любое из следующего сделает то, что вы ожидаете (то есть добавьте строку, а не расширять список символами строки):

b += [c]

или

b.append(c)
10 голосов
/ 30 ноября 2011

Оператор += расширяет список вместо добавления к нему:

>>> b = []
>>> c = "1234"
>>> b.append(c)
>>> b
['1234']
>>> b.extend(c)
>>> b
['1234', '1', '2', '3', '4']
>>> b += c
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4']
>>> b += [c]
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4', '1234']
3 голосов
/ 01 декабря 2011

Это ответ не на исходный вопрос (на который я думаю, что он получил адекватный ответ), а на многочисленные вопросы, которые были заданы в комментариях о семантике расширенного назначения (+= и подобных операциях). 1002 *

В двух словах: Расширенное назначение работает по-разному для изменяемых типов, чем для неизменяемых.

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

>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)

str имеет ту же семантику. По сути, a += b эквивалентно a = a + b, если a является неизменным.

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

>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]

Принимая во внимание, что если бы третья строка была заменена на a = a + [3, 4], новый список был бы создан и b был бы [1, 2].

Для пользовательского класса семантика зависит от того, как он был реализован, но это то, как это должно быть сделано в соответствии с PEP 203.

2 голосов
/ 30 ноября 2011

+ = - синтаксический сахар для расширения, но + - просто конкатенация списка. Если вы расширяете, вы будете перебирать аргумент, который в данном случае является строкой. Но вы не можете объединить строку в список, поэтому + не удается.

2 голосов
/ 30 ноября 2011

Строка - это последовательность символов.Операция со списком += принимает любую последовательность и добавляет каждый элемент последовательности в список.

(На самом деле += принимает любую итерацию.)

0 голосов
/ 30 ноября 2011

В сущности, оператор + = в списке будет получать итератор c, который будет приводить отдельные символы по порядку.Если вы намеревались добавить фактическую строку в список, получив результат ['1234'], вместо этого вы можете использовать b.append ('1234').

0 голосов
/ 30 ноября 2011

Чего ты ожидал?Если вы хотите добавить c в качестве строки, вы должны сделать:

b.append(c)

Cheers!

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