+ =는 파이썬에서 정확히 무엇을합니까?


118

+ =가 파이썬에서 무엇을하는지 알아야합니다. 그렇게 간단합니다. 나는 또한 파이썬에서 다른 짧은 도구의 정의에 대한 링크를 고맙게 생각합니다.



2
파이썬 (그리고 다른 많은 언어들도)의 기본 연산자입니다. 파이썬 참조를 읽지 않는다면 구글로 시작해야합니다.
technomage

3
@AndiDog 사실이지만 두 질문 모두 (+ =) 연산자에 관한 것이지만, 링크 한 것은 정교한 사용법과 미묘한 문제에 관한 것이며 여기에서 OP는 아마도 거기에서 추론을 따를 수 없을 것입니다 (아직).
박사 벨리 사리우스

3
@AndiDog은 아마 당신은 그 시간에 맞았지만, 여기에 (거의) 가능 솔루션을보고,이 질문은 운영자에 대한 기본적인 이해에 관한 것은 분명하다 : D
벨리 사리우스 박사

1
대부분의 요약 사용은 이제 기호 페이지 docs.python.org/3/genindex-Symbols.html에 색인화됩니다 .
Terry Jan Reedy 2014 년

답변:


148

파이썬에서 + =는 __iadd__특별한 방법에 대한 설탕 코팅 __add__이거나 존재하지 않는 __radd__경우 __iadd__입니다. __iadd__클래스 의 메소드는 원하는 모든 것을 할 수 있습니다. 목록 객체는이를 구현하고 목록의 extend 메소드와 동일한 방식으로 각 요소를 자체에 추가하는 반복 가능한 객체를 반복하는 데 사용합니다.

다음은 __iadd__특수 메서드 를 구현하는 간단한 사용자 지정 클래스입니다 . int로 객체를 초기화 한 다음 + = 연산자를 사용하여 숫자를 추가 할 수 있습니다. __iadd__호출 되는 것을 보여주기 위해 print 문을 추가했습니다 . 또한 __iadd__객체를 반환 할 것으로 예상되므로이 경우에 의미가있는 다른 숫자와 함께 자신을 더한 값을 반환했습니다.

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

도움이 되었기를 바랍니다.


24
이것은 Asker가 찾고 있던 것이 아니지만 실제 답변을 얻으려면 +1하십시오. =)
Michael

@Michael, 유머가 사실에 추가되는 곳입니다 ... :-D
아론 존 사부

3
질문에 대답 +1하지만, -1에 대한 __iadd__(자체 추가 가능한 인) 다른 유형을 반환
Caleth

이 대답은 + =가 무엇을 의미하는지 물어볼 필요가있는 사람 (즉, 초보자)에게는 너무 복잡합니다. 귀하의 답변은 초보자가 아닌 초보자가 일반적으로 객체 지향 방식으로 Python을 배우기 시작하지 않기 때문일뿐만 아니라 훨씬 더 간단한 답변이 있기 때문입니다 (아래 @Imran의 경우). 이 답변에 감사하지만 내 2 센트입니다.
q- 컴퓨팅

129

+= 변수의 값으로 다른 값을 추가하고 새 값을 변수에 할당합니다.

>>> x = 3
>>> x += 2
>>> print x
5

-=, *= , /=뺄셈, 곱셈과 나눗셈 유사한다.


19
정수는 불변이기 때문에 "자체"는 실제로 매우 나쁜 설명입니다.
AndiDog 2011 년

41

x += 5x = x + 5파이썬에서 말하는 것과 정확히 동일하지 않습니다 .

여기 참고 :

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

참조 : 왜 + =가 목록에서 예기치 않게 작동합니까?


그것은 이상한 경우를 제외하고,하지만, 동일x += 7,8,9
UFO에

또한 연결된 스레드 중 하나는 정확히 다른 부분에 대한 좋은 토론을 제공합니다. stackoverflow.com/questions/6951792/…
Ufos 2010 년

31

+=변수에 숫자를 추가하여 프로세스에서 변수 자체를 변경합니다 (반면 +). 이와 유사하게 변수를 수정하는 다음도 있습니다.

  • -=, 변수에서 값을 빼서 변수를 결과로 설정합니다.
  • *=, 변수와 값을 곱하여 결과를 변수로 만듭니다.
  • /=, 변수를 값으로 나누어 결과를 변수로 만듭니다.
  • %=, 변수에 대해 모듈러스를 수행하고 변수를 그 결과로 설정합니다.

다른 것이있을 수 있습니다. 저는 파이썬 프로그래머가 아닙니다.


2
숫자의 경우이 답이 맞습니다. (참조 브라이언의 대답 특별한 행동.)이 참으로 비트 연산자 (를 포함한 여러 다른, &=, >>=, 등) 추가 수학 연산자 ( **=등).
Michael


15

단순한 구문상의 지름길이 아닙니다. 이 시도:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

이것은 + =가 iadd 목록 메소드를 호출하지만 +는 목록과 다른 작업을 수행하는 add를 호출 한다는 것을 보여줍니다.


7

개념적으로 a + = b는 결과를 a에 저장하는 데 b를 "추가"합니다. 이 단순한 설명은 여러 언어로 + = 연산자를 설명합니다.

그러나 단순한 설명은 몇 가지 질문을 제기합니다.

  1. "추가"란 정확히 무엇을 의미합니까?
  2. "결과를 a에 저장"한다는 것은 정확히 무엇을 의미합니까? 파이썬 변수는 객체에 대한 참조를 저장하는 값을 직접 저장하지 않습니다.

파이썬에서이 두 질문에 대한 답은 a의 데이터 유형에 따라 다릅니다.


그렇다면 "추가"는 정확히 무엇을 의미합니까?

  • 숫자의 경우 숫자 더하기를 의미합니다.
  • 목록, 튜플, 문자열 등의 경우 연결을 의미합니다.

목록의 경우 + =가 +보다 더 유연하고 목록의 + 연산자에는 다른 목록이 필요하지만 + = 연산자는 모든 반복 가능 항목을 허용합니다.


그렇다면 "값을 a에 저장"한다는 것은 무엇을 의미합니까?

객체가 변경 가능하면 제자리에서 수정을 수행하는 것이 좋습니다 (필수는 아님). 따라서 이전에했던 것과 동일한 객체를 가리 키지 만 해당 객체는 이제 다른 내용을 갖습니다.

객체가 불변이면 분명히 제자리에서 수정을 수행 할 수 없습니다. 일부 변경 가능한 객체에는 내부 "추가"작업의 구현이 없을 수도 있습니다. 이 경우 변수 "a"는 추가 작업의 결과를 포함하는 새 개체를 가리 키도록 업데이트됩니다.

기술적으로 이것은 __IADD__먼저 찾음으로써 구현되며 , 구현되지 않은 경우 __ADD__시도되고 마지막으로 __RADD__.


정확한 유형이 확실하지 않고 특히 유형이 변경 가능한지 여부가 확실하지 않은 변수에 파이썬에서 + =를 사용할 때는주의가 필요합니다. 예를 들어 다음 코드를 고려하십시오.

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

튜플을 사용하여 dostuff를 호출하면 튜플이 + = 연산의 일부로 복사되므로 b는 영향을받지 않습니다. 그러나 목록으로 호출하면 목록이 제자리에서 수정되므로 a와 b 모두 영향을받습니다.

Python 3에서는 "bytes"및 "bytearray"유형에서 유사한 동작이 관찰됩니다.


마지막으로 객체가 교체되지 않은 경우에도 재 할당이 발생합니다. 왼쪽이 단순히 변수 인 경우에는 그다지 중요하지 않지만 예를 들어 변경 가능한 컬렉션을 참조하는 변경 불가능한 컬렉션이있는 경우 혼란스러운 동작을 유발할 수 있습니다.

a = ([1,2],[3,4])
a[0] += [5]

이 경우 [5]는 a [0]이 참조하는 목록에 성공적으로 추가되지만 나중에 코드가 a [0]을 재 할당하려고 시도하고 실패하면 예외가 발생합니다.


5

짧은 대답은 +="+ =의 오른쪽에있는 모든 것을 + ="의 왼쪽에있는 변수에 추가하는 것으로 번역 될 수 있습니다.

전의. 그렇다면 a = 10다음과 a += 5같습니다. a = a + 5

따라서 "a"는 이제 15와 같습니다.


이 답변은 아직 논의되지 않은 무엇에 기여합니까? 그것은 ... 중복 대답

jdv, 도와 주려는 것뿐입니다. 저는 새로운 기여자입니다. 제 답변이 중복되었다고 생각하시면 죄송합니다.

대부분의 다른 답변을 보면 중복이라는 것이 분명합니다. 기여하는 것은 좋지만 새로운 것을 제공하기 위해 노력해야합니다 (예 : add vs iadd 답변). 더 명확한 솔루션을 찾고자합니다. 그러나 내가 말할 수있는 한, 가장 많이 득표 한 답변은 기본 답변에 대해 얻을 수있는 것만 큼 분명합니다.

4

참고 x += y로 동일하지 않은 x = x + y부가 연산자로 인해 포함되는 일부 상황에서 운전자 우선 오른쪽 항상 예 먼저 평가된다는 사실과 함께

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

첫 번째 경우는 다음으로 확장됩니다.

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

다른 운영자와 '실제'에서이 문제를 만날 가능성이 더 높습니다.

x *= 2 + 1== x = x * (2 + 1)! =x = x * 2 + 1


4

+= 글쓰기의 지름길 일뿐입니다

number = 4
number = number + 1

그래서 대신 당신은

numbers = 4
numbers += 1

두 가지 방법 모두 정확하지만 예제 2는 코드를 약간 적게 작성하는 데 도움이됩니다.


1
동작은 숫자에서 동일하지만 일반적으로 동일하지 않습니다.
플러그 워시

0

다른 사람들도 말했듯이 + = 연산자는 바로 가기입니다. 예 :

var = 1;
var = var + 1;
#var = 2

다음과 같이 작성할 수도 있습니다.

var = 1;
var += 1;
#var = 2

따라서 첫 번째 예제를 작성하는 대신 두 번째 예제를 작성하면 잘 작동합니다.


0

예를 들어 이전 계산기에서 2와 3의 합계를 냈을 때와 합계에 =3이 추가 된 것을 볼 때마다 +=유사한 작업을 수행합니다. 예:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

여러 정수와 함께 + =를 사용하여 표시되지 않는 많은 답변을보고 있습니다.

한 가지 예 :

x -= 1 + 3

이것은 다음과 유사합니다.

x = x - (1 + 3)

그리고 아닙니다 :

x = (x - 1) + 3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.