Что означает + = в Python? - PullRequest
10 голосов
/ 05 мая 2009

Я вижу такой код, например, в Python:

    if cnt > 0 and len(aStr) > 1:
        while cnt > 0:                  
            aStr = aStr[1:]+aStr[0]
            cnt += 1

Что означает +=?

Ответы [ 6 ]

69 голосов
/ 05 мая 2009

a += b по существу совпадает с a = a + b, за исключением того, что:

  • + всегда возвращает вновь выделенный объект, но += должен (но не обязан) изменять объект на месте, если он изменчив (например, list или dict, но int и str неизменны).
  • В a = a + b, a оценивается дважды.

http://docs.python.org/reference/simple_stmts.html#augmented-assignment-statements


Если вы впервые сталкиваетесь с оператором +=, вы можете задаться вопросом, почему так важно, чтобы он мог модифицировать объект на месте, а не строить новый. Вот пример:

# two variables referring to the same list
>>> list1 = []
>>> list2 = list1

# += modifies the object pointed to by list1 and list2
>>> list1 += [0]
>>> list1, list2
([0], [0])

# + creates a new, independent object
>>> list1 = []
>>> list2 = list1
>>> list1 = list1 + [0]
>>> list1, list2
([0], [])
24 голосов
/ 05 мая 2009
a += b

равно в этом случае так же, как

a = a + b

В этом случае cnt + = 1 означает, что cnt увеличивается на единицу.

Обратите внимание, что вставленный вами код будет зацикливаться бесконечно, если cnt> 0 и len (aStr)> 1.

Редактировать : цитата Карл Мейер : `` [..] ответ обманчиво в основном правильный. Существует небольшая, но очень существенная разница между + и + =, см. ответ Бастьена . ''.

7 голосов
/ 05 мая 2009

Google 'python + = operator' ведет вас к http://docs.python.org/library/operator.html

Поиск + = после загрузки страницы для более подробного ответа.

1 голос
/ 05 мая 2009

К вашему сведению: похоже, в вашем примере бесконечный цикл ...

if cnt > 0 and len(aStr) > 1:
    while cnt > 0:                  
        aStr = aStr[1:]+aStr[0]
        cnt += 1
  • условие входа в цикл состоит в том, что cnt больше 0
  • цикл продолжает работать до тех пор, пока cnt больше 0
  • каждая итерация цикла увеличивается cnt на 1

В результате cnt будет всегда больше 0 и цикл никогда не завершится.

0 голосов
/ 05 мая 2009

+= является оператором сложения на месте .

Это то же самое, что и cnt = cnt + 1. Например:

>>> cnt = 0
>>> cnt += 2
>>> print cnt
2
>>> cnt += 42
>>> print cnt
44

Оператор часто используется аналогично оператору ++ в языках C-ish, чтобы увеличить переменную на единицу в цикле (i += 1)

Есть аналогичные операторы для вычитания / умножения / деления / мощности и других:

i -= 1 # same as i = i - 1
i *= 2 # i = i * 2
i /= 3 # i = i / 3
i **= 4 # i = i ** 4

Оператор += также работает со строками, например:

>>> s = "Hi"
>>> s += " there"
>>> print s
Hi there

Люди обычно рекомендуют не делать этого по соображениям производительности, но для большинства сценариев это действительно не проблема. Цитировать из "Типы последовательности" документов :

  1. Если s и t оба являются строками, некоторые реализации Python, такие как CPython, обычно могут выполнять оптимизацию на месте для назначений вида s = s + t или s + = t. Когда это применимо, эта оптимизация делает квадратичное время выполнения гораздо менее вероятным. Эта оптимизация зависит как от версии, так и от реализации. Для кода, чувствительного к производительности, предпочтительно использовать метод str.join (), который обеспечивает согласованную производительность линейной конкатенации между версиями и реализациями.

Метод str.join () относится к следующему:

mysentence = []
for x in range(100):
    mysentence.append("test")
" ".join(mysentence)

.. вместо более очевидного:

mysentence = ""
for x in range(100):
    mysentence += " test"

Проблема с последним (кроме начального пробела), в зависимости от реализации Python, интерпретатор Python должен будет создавать новую копию строки в памяти каждый раз, когда вы добавляете (потому что строки неизменяемы), который будет становиться все медленнее, чем длиннее добавляемая строка. Принимая во внимание, что добавление в список и последующее объединение его в строку - это постоянная скорость (независимо от реализации)

Если вы выполняете базовые операции со строками, не беспокойтесь об этом. Если вы видите цикл, который в основном просто добавляет строку, рассмотрите возможность создания массива, а затем "".join() его использования.

0 голосов
/ 05 мая 2009

это означает "добавить" ЭТО "к текущему значению"

пример:

a = "привет"; a + = "мир";

печать сейчас выдаст: "привет мир"

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