ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래밍 언어] 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

     

     

     

Designed by Tistory.