Форум сайта python.su
Продолжаю разбираться с Python. В одном из самоучителей по нему прочитал, что можно складывать только однотипные данные. Речь шла о списках и кортежа. Столкнулся с таким поведением:
a= ("x","y") b=["n","p"]
с=None c=a+b a=a+b b=a+b a+=b
b+=a
Отредактировано Bilbo (Март 24, 2017 12:40:54)
Офлайн
Похоже на баг.
Семантика bytearray() реализована теми же методами, но так не работает.
>>> b = bytearray(b'abc') >>> b bytearray(b'abc') >>> b + [1, 2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat bytearray to list >>> b += [1, 2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat list to bytearray >>> b.extend([1, 2]) >>> b bytearray(b'abc\x01\x02') >>>
>>> lst = [1, 2, 3] >>> >>> lst + 'abc' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list >>> >>> lst += 'abc' >>> lst [1, 2, 3, 'a', 'b', 'c'] >>>
Отредактировано py.user.next (Март 24, 2017 13:13:27)
Офлайн
Эмм. Это никакой не баг
Лучано Ромальо. Python. К вершинам мастерства.
Отредактировано 4kpt_V (Март 24, 2017 13:28:30)
Офлайн
> В чем здесь нюанс и отличие от b=b+a?
В том что ты в первом случае пытаешься изменить картеж.
> Пользуясь случаем сразу спрошу зачем существуют кортежи, в чем их преимущество перед списками?
В том что их нельзя изменять.
> Знаю, что они неизменяемые, но можно ли это отнести к достоинствам?
Конечно! ИХМО изменяемые объекты это зло.
Офлайн
4kpt_VЭто нужно не в книжке смотреть, а в документации. Но тут и без документации понятно, что это поведение не одижаемо для пользователя.
Эмм. Это никакой не баг :)
Лучано Ромальо. Python. К вершинам мастерства.
lst = lst + 'abc' - не работает
lst += 'abc' - работает
Отредактировано py.user.next (Март 24, 2017 14:14:06)
Офлайн
То, что оно не ожидаемо, это еще не значит, что это баг. Это раз. В делфи вообще тьма тьмущая приведения типов. Просто, в пайтоне этого нет на базовых типах и мы привыкли
вот тут описано почему так происходит
Отредактировано 4kpt_V (Март 24, 2017 15:00:07)
Офлайн
py.user.nextчето сомнения меня терзают по этому поводу.Поправте если я не прав.
Хотя вторая операция является сокращённой записью первой операции.
>>> a=[1,2,3] >>> id(a) 25782232 >>> a+=[4] >>> id(a) 25782232 >>> a= a+ [5] >>> id(a) 25767688 >>>
[code python][/code]
Отредактировано PEHDOM (Март 24, 2017 21:37:53)
Офлайн
PEHDOM
Так и написано в топике, который я выше скинул. Вы правы. В одном случае происходит изменение объекта, а в другом создание нового. Но все равно поведение не очевидное и для питона это проблема. При этом мы не привыкли к неявному приведению типов. А тут такое…
Офлайн
4kpt_VТам описано другое
вот тут описано почему так происходит
Operator Overload, __and__, (+) and __iand__ (+=)
Both + and += operators are defined for list. They are semantically similar to extend.
my_list + another_list creates a third list in memory, so you can return the result of it, but it requires that the second iterable be a list.
my_list += another_list modifies the list in-place (it is the in-place operator, and lists are mutable objects, as we've seen) so it does not create a new list. It also works like extend, in that the second iterable can be any kind of iterable.
lst = lst + [1, 2] - работает
lst += [1, 2] - работает
lst = lst + 'abc' - не работает
lst += 'abc' - работает
>>> lst = [1, 2, 3] >>> >>> lst + range(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "range") to list >>> >>> lst += range(3) >>> >>> lst [1, 2, 3, 0, 1, 2] >>>
Отредактировано py.user.next (Март 25, 2017 00:47:31)
Офлайн
Да там просто вопрос был по list, поэтому человек и ответил про list. Был бы вопрос по tuple был бы тот же ответ. Это не бага. Это просто такая возможность. Типа как в последнем пайтоне словари, которые хранят последовательность. Просто возможность неявная, но это уже другое дело. Ну и все в документации написать не получиться никогда.
Офлайн