Python

[프로그래밍 언어] Python 기초

SCodaily 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