immutable mutable aliasing

chi·2023년 3월 25일

자료구조

목록 보기
1/13

매개변수를 통한 값 전달

자료구조 책 32p 참고


함수의 범위

# outer(), inner() 함수 입장에서 전역(global) 범위
def outer():
    # outer() 함수 입장에서 지역(local) 범위
    # inner() 함수 입장에서 비지역(nonlocal) 범위
    def inner():
        # inner 함수 입장에서 지역(local) 범위

변수의 범위의 다른 중요한 특성은 서로 다른 범위에서는 변수 이름 충돌이 발생하지 않으며 안 쪽 범위에서 바깥 쪽 범위에서 선언된 변수와 똑같은 이름의 변수를 생성할 수 있다는 것입니다. 예를 들어, 아래에 선언된 3개의 var 변수는 이름만 같을 뿐 서로 다른 값을 저장할 수 있는 엄연히 다른 변수입니다.

var = "지역 변수"

def outer():
    var = "비지역 변수"

    def inner():
        var = "지역 변수"
num = 0

def change_num():
    num = 100
    print(num)

change_num()

print(num)

결과가 100 두 번일 것 같지만 아님. 다른 num이기 때문에 100 0 이렇게 나옴
위의 alias 랑 이거랑 다른 건 하나의 객체를 두고 둘 이상의 변수가 있냐(alias)와 하나의 변수 이름(num)을 두고 다른 객체의 값이 있을 수 있냐
아 그니까 리스트 같은 경우 이거처럼 함수 안(지역)에서 전역 변수에 영향을 줄 수 있는데 만약 그게 아니라면
이거처럼 아예 다른 변수로 봄.

num = 0

def chnage_num():
    global num
    num = 100
    print(num)

chnage_num()

print(num)

이렇게 써야 100이 두 번 출력됨.

def f2(n):
    result=1
    
    def factorial(n):
        nonlocal result
        if n>1:
            result*=n
            factorial(n-1)
        if n==1:
            return result
    
    factorial(n)
    print(result)
    return result
a=f2(64)
b=f2(56)
c=f2(8)
print(a)

global nonlocal

global은 전역변수 (main()모듈의 전역변수)를 함수 안에서 변경하고 싶을 때
nonlocal은 중첩함수에서 속에 있는 함수가 밖에 있는 함수의 변수를 변경할 때

파이썬의 메모리 구조


위 이미지를 보면 python은 stack, heap memory 두 가지를 사용합니다. stack memory에는 참조자가 저장되고 heap memory에는 객체가 저장됩니다. 기존에 C++, Java와는 다르게 메모리에 값이 들어가는 형태가 아닌 heap memory에 객체가 생성(int, string, class 등)이 되면 변수에서 그곳을 참조(reference)하는 형태로 메모리 할당이 됩니다.

https://woochan-autobiography.tistory.com/867

https://jay-ji.tistory.com/105 이것도 봐

파이썬의 모듈 module

import 어쩌구.
그리고 어쩌구 안에 있는 함수를 씀
파이썬의 module은 심즈의 확장팩 같은 개념이구나
module 안의 함수는 확장팩 안의 기능들이랑 같은.

얕은 복사 깊은 복사

list() 나 copy 모듈 안의 copy나 얕은 복사임.
copy 모듕 안의 deepcopy가 깊은 복사임.

얕은 복사

얄팍해서 거기까진 복사 못했구나 ㅋ

깊은 복사

완벽히 모방

변수의 자료형 선언 가능

파이썬에선 자동으로 자료형이 할당되는데 혹시나 나중에 오류 생길까봐 사용자가 직접 정의하는 방식이 도입됨.

(변수명): (자료형) = (초기값) #초기값은 생략가능
a: int = 4
print(a)

for in 의 활용도

리스트도

list1=[i for i in range(10)]

결과는 [0,1,2,3,4,5,6,7,8,9]

이런 식으로 만들 수 있음
for i in (리스트, range, )

값이 0인 방 여러개
list1=[0 for i in rabge(10)]
결과는 [0,0,0,0,0,0,0,0,0,0]

해시 테이블

https://jinyes-tistory.tistory.com/10

0개의 댓글