Почему список не может быть объединен с str с помощью оператора '+' в python? - PullRequest
4 голосов
/ 11 марта 2020

Я хочу понять разницу между list +='a' и list=list+'a' Например, если я сделаю это:

li=[]
for i in 'string':
    li+=i

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

li=[]
for i in 'string':
    li=li+i

TypeError: может только объединить список (не "str") в список

Правильный способ сделать это, будет что-то как это:

li=[]
for i in 'string':
    li=li+[i]

Я хочу знать, как работает оператор +=? Как он может получить строку внутри списка, конвертирует ли она строку в список?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Я хочу знать, как работает оператор + =?

оператор присваивания на месте += работает двумя способами (из документов ) :

1) Для неизменяемых объектов

Для неизменяемых целей, таких как строки, числа и кортежи, обновленное значение вычисляется, но не присваивается обратно входная переменная

это означает, что вы будете создавать новый объект каждый раз, когда += используется (если ваш объект неизменен)

2) Для изменяемых объектов

Для изменяемых целей, таких как списки и словари, метод на месте выполнит обновление, поэтому последующее назначение не требуется

это означает, что вы будете не создавать новый объект каждый раз, когда используется += (если ваш объект изменчив)


В вашем примере, чтобы использовать li+=i, вы должны убедиться, что i является списком, в противном случае не будет работать

Здесь:

li = []
for i in 'string':
    li = li + [i]

вы объединяете 2 списка, но каждый Когда вы создаете новый список li, вы можете проверить с помощью встроенной функции id :

li=[]
for i in '1':
    print(id(li))
    li=li+[i]
    print(id(li))

output:

140661631713104
140661644452240

you можно использовать оператор присваивания на месте += следующим образом:

li=[]
for i in '1':
    print(id(li))
    li += [i]
    print(id(li))

output:

140661641698592
140661641698592

, поскольку вы можете видеть, что элементы добавляются в список li без создания новый li список, который более эффективен, работает аналогично list.extend

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

1 голос
/ 11 марта 2020

Python документы говорят:

Чтобы понять, почему это происходит, вам нужно знать, что (a) если объект реализует метод __ iadd__ magi c, он вызывается когда выполняется расширенное присваивание + = , и его возвращаемое значение используется в операторе присваивания; и (b) для списков, __iadd__ эквивалентно вызову extension в списке и возвращению списка. Вот почему мы говорим, что для списков + = является «сокращением» для list.extend .

Поскольку list.extend ожидает итератор, а строка является итеративной, += работает в вашем примере. Это означает, что вам даже не нужен for-l oop, так как list.extend будет перебирать строку и добавлять элементы в список.
li=[] li += "string" Вывод: ['s', 't', 'r', 'i', 'n', 'g']

Список может только объединять (+) список.

Источник:
https://docs.python.org/3/tutorial/datastructures.html https://docs.python.org/3/reference/datamodel.html#emulating -numeri c -типы https://docs.python.org/3/faq/programming.html#faq -augmented присваивание кортежей ошибок

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