1. General form
Assignment statement의 일반적인 형태는 다음과 같음.
varible = expression
2. 수행 순서
=
기호의 오른쪽의expression
을 evaluation함 (하나의 값으로 reduction)- 1번의 값에 해당하는 object (해당 값을 value로 가진 object)가 저장된 memory address (CPython에서는 해당 object의
ID
가 이에 해당)를variable
의 value(값)으로 넘겨줌. =
기호의 왼쪽에 있는variable
이 가지는 name이 최초로 등장한 경우, 해당 variable을 생성시키게 됨.- 만약 해당 name의
variable
이 있었다면 이variable
의 값이 2번에서 구한 결과 object의ID
로 변경됨.
3. Example
다음 코드를 예를 들어 설명한다.
아래 코드 다음 책의 2장에서 가져온 것임 : Practical Programming, Third Edition :An Introduction to Computer Science Using Python 3.6
>>> degrees_celsius = 26.0 + 5
>>> degrees_celsius
31.0
=
의 오른쪽의expression
인26.0 + 5
를 evaluation 해서31.0
이라는 값이 생성(type은 float임)되고
해당 object는 memory에 저장됨 (= memory address, 즉ID
가 생성됨)- 왼쪽의
variable
의 name인degrees_celsius
가 현재 namespace에 없을 경우,
해당 name의 variable을 생성하고 앞서 구한ID
를 값으로 가지게 하여31.0
의 object를 참조하게 한다.
이후 degrees_celsius
는 31.0
의 값을 가리키므로 exression
에서 사용될 경우 해당 값으로 치환되게 된다.
이를 그림으로 표현하면 다음과 같음.
위의 코드를 pytutor에서 확인하면 다음과 같음.
namespace (or frame)에서 관리되는 variable은 값으로 memory address (or ID)를 가짐으로써 실제 object들을 참조하게 됨.
Python에서
- Variable은 가리키는 object를 자유롭게 변경할 수 있고 사전에 Type을 가지고 선언될 필요가 없으나(Dynamic Typed Language),
- Object 자체는 한 번 생성되면 자신의 Type을 바꿀 수 없음(Strong Type).
주의: Assignment는 Expression이 아님.
할당은 statement이기 때문에 할당문을 조건식에 넣어서는 안됨.
Python 3.8 이후 Walrus Assignment ( = 대신 := 를 사용)가 도입되었고, 이는 할당도 수행하며 할당된 값으로 치환되는 expression으로 동작함.
if (n := len(my_list)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
4. 참고자료
2023.06.12 - [Programming] - [Python] Expression vs. Statement
2023.06.12 - [Programming] - [Python] (Data) Type : Summary
2023.06.11 - [Programming] - [Python] Dynamic Language vs. Static Language
2023.06.13 - [Programming] - [Python] Strong Typing이란? with Object
2023.06.11 - [Programming] - [Basic] namespace, frame, and context
2023.06.13 - [Programming] - [Python] Variable (and Object)
'Programming' 카테고리의 다른 글
[Python] Basic Methods of String (0) | 2023.06.21 |
---|---|
[Python] f-String (1) | 2023.06.21 |
[Python] Module Search Path and sys.path (0) | 2023.06.18 |
[Python] importlib.reload : module 재적재 (0) | 2023.06.18 |
[Python] Exception 처리 (0) | 2023.06.16 |