정글에서 온 개발자

파이썬 ‘=’ 이 연산자가 아니다 논란과 주의할 점 본문

정리

파이썬 ‘=’ 이 연산자가 아니다 논란과 주의할 점

dev-diver 2023. 10. 16. 01:55
  • 사실 논란의 여지가 없다. ‘=’ 은 연산자(operator)가 아니라 **구분기호(delimeter)**다.
  • 할당 구분자를 사용한 문장은 식(expression)이 아니고 아니라 문(statement)이다. (=할당문)
  • [2. Lexical analysis

A Python program is read by a parser. Input to the parser is a stream of tokens, generated by the lexical analyzer. This chapter describes how the lexical analyzer breaks a file into tokens. Python...

docs.python.org](https://docs.python.org/3/reference/lexical_analysis.html#operators)

  • 위 Document를 열어보면 = 이 Operator가 아니라 Delimeter에 자리한 것을 볼 수 있다.

이게 어떤 의미를 가지나?

  • statement(문): 실행 결과가 평가될 수 없음.
  • expression(식) : 실행 결과가 평가될 수 있음.

파이썬에서는 = 이 할당’’이라서 아래 코드가 에러가 난다.

print(a=1) # TypeError: 'a' is an invalid keyword argument for print()

반면 js는 잘 돌아간다.

console.log(a=1)  //1

파이썬부 3.8부터 할당표현식 이 생겼다고 한다.

print(a:=1) #1

표현식이 옆으로 누운 바다코끼리(walrus) 처럼 생겨서 (walrus operator) 라고 한다.

바다코끼리
:= 개발자들 귀여운 거 은근 좋아함

파이썬 할당문의 특징

  • 파이썬의 할당문은 연산자가 아니기 때문에 오른쪽 결합연산자도 아니다.
  • a=b=1 을 하면 a=1 이 먼저 실행된다.
  • 그게 뭔 상관이야 싶지만, 참조 관계를 바꾸는 등 대입의 순서가 중요한 경우 그냥 논리 순서대로 나눠쓰는 것이 좋다.
  • [How do chained assignments work?

A quote from something: >>> x = y = somefunction() is the same as >>> y = somefunction() >>> x = y Question: Is x = y = somefunction() the same as x = somefuncti...

stackoverflow.com](https://stackoverflow.com/questions/7601823/how-do-chained-assignments-work)

[7. Simple statements

A simple statement is comprised within a single logical line. Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: Expression statement...

docs.python.org](https://docs.python.org/3/reference/simple_stmts.html#assignment-statements)

An assignment statement evaluates the expression list (remember that this can be a single expression or a comma-separated list, the latter yielding a tuple) and assigns the single resulting object to each of the target lists, from left to right.

  • 특히 중요한건 immutable을 대입할 때 의도와 다르게 동작할 수 있다.
    • 둘 다 같은 id가 할당되기 때문에, 한쪽을 수정하면 다른쪽도 수정돼 버릴 수 있다.
a=b=[1,2,3]
a[2]=0  # a ,b 둘다 [1,2,0]

소소하지만 알고 쓰면 예상치 못한 동작을 예방할 수 있다!