[프로그래밍 언어] Python 기초
컴파일러(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