Форум сайта python.su
Да там просто вопрос был по list, поэтому человек и ответил про list. Был бы вопрос по tuple был бы тот же ответ. Это не бага. Это просто такая возможность. Типа как в последнем пайтоне словари, которые хранят последовательность. Просто возможность неявная, но это уже другое дело. Ну и все в документации написать не получиться никогда.
Офлайн
мне кажеться “неявность” тут изза того что мы считаем будто 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]]
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)
Офлайн
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 >>>
4kpt_VА что там в последнем питоне со словарями? Вот это?
Типа как в последнем пайтоне словари, которые хранят последовательность.
Отредактировано py.user.next (Март 25, 2017 09:24:31)
Офлайн
Преимущество кортежей в том, что:
- Кортежи быстрее работают. Системе известно, что кортеж не изменится. Поэтому
его можно сохранить таким образом, что операции с его элементами будут
выполняться быстрее, чем с элементами списка. В небольших программах эта
разница в скорости никак не проявит себя, но в более сложных проектах, где
последовательности данных очень длинны, она может оказаться значительной.
- Неизменяемость кортежей делает их идеальным средством создания констант,
от которых мы и не ждем изменяемости. Константы, заданные кортежами, сделают
код понятнее и безопаснее.
- Кортежи применимы в отдельных структурах данных, от которых Python требует
неизменяемых значений. Словарь должен состоять из данных неизменяемого типа, поэтому в основе некоторых разновидностей словарей лежат кортежи.
Однако, конечно, нельзя отрицать, что гибкость списков выше, чем у кортежей.
Офлайн
Уже не вспомню где, но мне попадалось упоминание, что a+=b, где а - список, это то же самое, что а.extend(b). И это, мол, не баг, а сделано специально для удобства работы с циклами.
При этом если а - число или кортеж, то а+=b действительно аналогично a=a+b…
Офлайн