Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2017 08:26:02

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Конкатенация кортежа к списку

Да там просто вопрос был по list, поэтому человек и ответил про list. Был бы вопрос по tuple был бы тот же ответ. Это не бага. Это просто такая возможность. Типа как в последнем пайтоне словари, которые хранят последовательность. Просто возможность неявная, но это уже другое дело. Ну и все в документации написать не получиться никогда.

Офлайн

#2 Март 25, 2017 08:44:04

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Конкатенация кортежа к списку

мне кажеться “неявность” тут изза того что мы считаем будто a+=b это сокращенно a=a+b.
На самом деле это не так. a=a+b это переназначение(reassign) a. a+=b это инкремент a на b.
несмотря на то что в многих случаях они дают идентичный результат, это разные операции и работаю они по разному.
вот пример который показывает разницу в работе этих двух оперций


 import numpy as np
A = np.arange(12).reshape(4,3)
for a in A:
    a = a + 1
B = np.arange(12).reshape(4,3)
for b in B:
    b += 1
print('A:\n',A)
print('B:\n',B)
результат:
 A:
 [[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
B:
 [[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
в догонку
https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types
These methods are called to implement the augmented arithmetic assignments (+=, -=, *=, @=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |. These methods should attempt to do the operation in-place (modifying self) and return the result (which could be, but does not have to be, self). If a specific method is not defined, the augmented assignment falls back to the normal methods. For instance, if x is an instance of a class with an __iadd__() method, x += y is equivalent to x = x.__iadd__(y) . Otherwise, x.__add__(y) and y.__radd__(x) are considered, as with the evaluation of x + y. In certain situations, augmented assignment can result in unexpected errors (see Why does a_tuple += raise an exception when the addition works?), but this behavior is in fact part of the data model.
тоесть в ситуации a+=b если в а не определен __iadd__ тогда интерпретатор вызовет a__add__(b) отсюда и непонятки почему в одних случаях рабтает так , а в других иначе.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 25, 2017 09:09:03)

Офлайн

#3 Март 25, 2017 09:16:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Конкатенация кортежа к списку

PEHDOM
тоесть в ситуации a+=b если в а не определен __iadd__ тогда интерпретатор вызовет a__add__(b) отсюда и непонятки
Там дело в том, что один из методов работает неправильно. Таких багов в питоне дофига. Тут надо просто зайти к ним и написать вопрос (если ещё никто не спрашивал): “почему оно не согласуется?”. То, что они работают по-разному, это понятно, но они должны согласованы быть.

В случае с кортежами всё работает.
 >>> t = (1, 2, 3)
>>> 
>>> t  + (4,)
(1, 2, 3, 4)
>>> 
>>> t += (4,)
>>> t
(1, 2, 3, 4)
>>>

  
>>> t = (1, 2, 3)
>>> 
>>> t  + 'abc'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple
>>> 
>>> t += 'abc'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple
>>>

Видишь? А со списками какая фигня происходит. Там должно быть так же, как в bytearray(), поэтому либо bytearray() надо переделать, либо список исправить (вероятнее всего).

4kpt_V
Типа как в последнем пайтоне словари, которые хранят последовательность.
А что там в последнем питоне со словарями? Вот это?
Там написано, что это только замена реализации для ускорения. В плане поведения не меняется ничего и полагаться на новую реализацию нельзя, потому что она может отличаться в другом интерпретаторе, где может быть запущен код. Мы же помним, что код к интерпретатору не привязан, он может запускаться где угодно, на любом компьютере. Совпадать должна только версия питона.



Отредактировано py.user.next (Март 25, 2017 09:24:31)

Офлайн

#4 Апрель 3, 2017 22:15:16

DemianWolf
Зарегистрирован: 2017-04-01
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Конкатенация кортежа к списку

Преимущество кортежей в том, что:
- Кортежи быстрее работают. Системе известно, что кортеж не изменится. Поэтому
его можно сохранить таким образом, что операции с его элементами будут
выполняться быстрее, чем с элементами списка. В небольших программах эта
разница в скорости никак не проявит себя, но в более сложных проектах, где
последовательности данных очень длинны, она может оказаться значительной.
- Неизменяемость кортежей делает их идеальным средством создания констант,
от которых мы и не ждем изменяемости. Константы, заданные кортежами, сделают
код понятнее и безопаснее.
- Кортежи применимы в отдельных структурах данных, от которых Python требует
неизменяемых значений. Словарь должен состоять из данных неизменяемого типа, поэтому в основе некоторых разновидностей словарей лежат кортежи.
Однако, конечно, нельзя отрицать, что гибкость списков выше, чем у кортежей.



То, что не убивает нас, делает нас сильнее.

Офлайн

#5 Апрель 5, 2017 23:14:50

zzx1@R2D2
Зарегистрирован: 2017-03-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Конкатенация кортежа к списку

Уже не вспомню где, но мне попадалось упоминание, что a+=b, где а - список, это то же самое, что а.extend(b). И это, мол, не баг, а сделано специально для удобства работы с циклами.
При этом если а - число или кортеж, то а+=b действительно аналогично a=a+b…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version