Python: выражение возвращает другой ответ a = a + 1 против a + = 1 - PullRequest
0 голосов
/ 30 апреля 2019

Примечание: я знаю, что Python строго типизирован, и мы не будем объединять 2 разных типа. но случайно я попробовал ,

Я получил другой результат,

a = []
>>>a=a+1 #it gives me expected concatenate error
TypeError: can only concatenate list (not "int") to list


>>>a+=1 #but this wasn't
TypeError: 'int' object is not iterable

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

Из того, что я получаю, проводя эксперименты, это.

  1. a = a + 1 объединяет список и целое число, но, как мы знаем, + оператор или конкатенация требуют двух списков, поэтому мы получаем ошибку TypeError: can only concatenate list (not "range") to list, как мы видим ниже
In [43]: [] + 1                                                                 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-43-67dee89361ae> in <module>
----> 1 [] + 1

TypeError: can only concatenate list (not "int") to list
In [47]: [] + []                                                                
Out[47]: []
  1. В a += 1 мы внутренне называем a.extend(1) согласно документам: https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types

s.extend (t) или s + = t.
расширяет s содержимым t (по большей части такое же, как s [len (s): len (s)] = t)

Также из документов по адресу: https://docs.python.org/3/tutorial/datastructures.html

list.extend (итерация)
Расширьте список, добавив все элементы из итерируемого. Эквивалентен [len (a):] = повторяемый.

Таким образом, 1 рассматривается как итеративный, но поскольку int не является итеративным, мы получаем ошибку TypeError: 'int' object is not iterable, как мы видим ниже

In [49]: a = []                                                                 

In [50]: a.extend(1)                                                            
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-50-4671950943e4> in <module>
----> 1 a.extend(1)

TypeError: 'int' object is not iterable
2 голосов
/ 30 апреля 2019

Это потому, что operator + и operator + = не являются той же магической функцией, реализованной в классе списка.

__iadd__() ## Map to += Operator
__add__() ## Map to + Operator


Это означает, что вы запускаете другую магическую функцию объекта списка.

1 голос
/ 30 апреля 2019

Как указано, два оператора не отображаются на одну и ту же магическую функцию.И оба имеют разные реализации.Это имеет некоторые интересные последствия.обычный плюс (+ или __add__) ожидает объединения другого списка, тогда как добавление на месте (+= или __iadd__) более разрешающее и может взять любой итератор и превратить его в список перед добавлением:

a = []
a = a + range(2)
TypeError: can only concatenate list (not "range") to list

a += range(2)
[0, 1]

Я не знаю почему это так.

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