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

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



답변

파이썬에서 + =는 __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

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


답변

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

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

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


답변

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 += 2방법x = x + 2

또한 목록에 요소를 추가 할 수도 있습니다 . 이 SO 스레드를 참조하십시오 .


답변

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

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를 호출 한다는 것을 보여줍니다.


답변

개념적으로 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]을 재 할당하려고 시도하고 실패하면 예외가 발생합니다.