-
[프로그래밍 언어] Python 기초Python 2023. 3. 16. 17:41
컴파일러(Compiler) VS 인터프리터(Interpreter)
- C언어 ( Compiler )
고급 프로그래밍 언어(C) -> 어셈블리어 -> 기계어
소스 코드 -> 컴파일러(컴파일 타임) -> 어셈블러 -> 실행파일(런타임) -> 실행
실행과정에서 메모리 배정하고 싶은 경우 : 동적할당 사용
(C언어 : malloc, free / C++ : new, delete)
- Python ( Interpreter )
한 줄씩 실행, 메모리를 한 줄마다 할당.
변수와 메모리
데이터(변수) : 주소와 메모리(값)이 존재
고급 프로그래밍 언어에서 변수의 이름은 데이터의 주소를 쉽게 보기 위함
-> 결과적으로 변수의 주소값이 중요
파이썬에서의 변수할당 ( Mutable VS Immutable )
- Mutable ( 변화 가능한 )
List, Dict
- Immutable ( 변화 불가능한 )
Int, Float, Str, Tuple
# id -> 주소값 a = [1, 2, 3] print(id(a)) # 출력 : 4393788808 a[0] = 5 print(a) # 출력 : [5, 2, 3] print(id(a)) # 출력 : 4393788808
List -> mutable ( 변화가능 )
a라는 변수는 변화가능하기 때문에 내부의 값(메모리)에 접근하여 값 변경 가능
이때, a의 주소는 변하지 않음
s= "abc" id(s) # 출력 : 4387454680 print(s[0]) # 출력 : 'a' s[0] = 's' # 오류 발생 : 'str' object does not support item assignment # str 타입은 값 변경이 불가 s = 'def' print(s) # 출력 : 'def' print(id(s)) # 출력 : 4388970768
Str -> Immutable ( 변화불가 )
s변수는 string 타입으로 내부 값 변화가 불가능하기 때문에 오류 발생
위의 s변수와 밑의 s변수는 아예 서로 다른 변수(이름만 같은)
Shallow copy(얕은 복사) VS Deep copy(깊은 복사)
- Shallow copy ( 얕은 복사 )
새로운 메모리를 할당하지 않는 주소값만 복사
a = [1, 2, 3] b = a print(id(a)) # 출력 : 4303029896 print(id(b)) # 출력 : 4303029896
a[1] = 4 print(a) # 출력 : [1, 4, 3] print(b) # 출력 : [1, 4, 3]
a와 b는 변수의 이름만 다를 뿐 같은 주소값을 가지므로 같은 값(메모리를 가짐)
따라서 4303029896의 주소의 메모리를 변경하면 a든 b든 같은 메모리를 가지기 때문에 같은 값을 출력
- Deep copy ( 깊은 복사 )
import copy a = [1, 2, 3] b = copy.deepcopy(a) a.append(4) print(a) # 출력 : [1, 2, 3, 4] print(b) # 출력 : [1, 2, 3] print(id(a)) # 출력 : 1961854298816 print(id(b)) # 출력 : 1961853416320
새로운 메모리 공간을 할당 ( 다른 주소값 ) 하고 값 ( 메모리 )을 복사
따라서 서로 각각의 변수가 설정된 것이고 a의 변화가 b에 영향을 미치지 않음
주소값도 다름
변수 선언 ( 전역 변수 VS 지역 변수 )
- Global ( 전역 변수 )
해당 .py 내부 전역 범위에서 사용할 수 있는 변수
전역 변수 자체는 함수 외부에서도, 함수 내부에서도 사용할 수 있음
a = 1 def f1(): print(a) print(id(a)) f1() # 출력 : # 1 # 1933976365360 print(a) print(id(a)) # 출력 : # 1 # 1933976365360
- Local ( 지역변수 )
함수 내부에서 선언된 변수
함수 내부에서만 사용가능하고 함수를 빠져나오면 해당 변수의 메모리는 해제됨
a = 1 def f1(): b = 2 print(b) # 에러 : name 'b' is not defined
a = 1 def f2(): a = 2 print(a) print(id(a)) f2() # 출력 : # 2 # 1635657869648 print(a) print(id(a)) # 출력 : # 1 # 1635657869616
파이썬 함수 ( 기초, 파라미터, 파라미터 패싱, 리턴 )
- 함수란?
- Parameter, Paramter Passing
전역 변수와 지역 변수를 함수 내외부에서 바꿀 때 의문점.
a = list() def f2(): a.append(1) print(a) print(id(a)) f2() # 출력 : # [1] # 2624319552448 print(a) print(id(a)) # 출력 : # [1] # 2624319552448
a = 1 def f2(): a += 1 print(a) print(id(a)) # 에러 : local variable 'a' referenced before assignment
a = 1 def f2(a): a += 1 print(a) print(id(a)) f2(a) # 출력 : # 2 # 2516295182672 print(a) print(id(a)) # 출력 : # 1 # 2516295182640
- Pass by assignment
위의 변수의 mutable, immutable에 따라 달라짐.
- return
output으로 함수 내부의 local 변수에 대한 값을 global 변수로 설정하여 사용할 수 있다.
a = 1 def f2(): a = 2 print(a) print(id(a)) return a b = f2() # 출력 : # 2 # 1669616003408 print(a) print(id(a)) # 출력 : # 1 # 1669616003376 print(b) print(id(b)) # 출력 : # 2 # 1669616003408
cf ) immutable 타입을 local에서 사용하기
global 타입 선언
a = 1 def f2(): global a print(a) print(id(a)) f2() # 출력 : # 1 # 2233786591536 print(a) print(id(a)) # 출력 : # 1 # 2233786591536
'Python' 카테고리의 다른 글
[OOP] Binary Search Tree 자료구조 만들기 (0) 2023.03.20 [OOP] Linked List 자료구조 만들기 (0) 2023.03.19 [프로그래밍 언어] Python Class 객체 지향(Object Oriented) (0) 2023.03.19 [Python] Heapq 모듈로 힙(Heap) 구현하기 (0) 2022.10.20