자료구조 책 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은 전역변수 (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 이것도 봐
import 어쩌구.
그리고 어쩌구 안에 있는 함수를 씀
파이썬의 module은 심즈의 확장팩 같은 개념이구나
module 안의 함수는 확장팩 안의 기능들이랑 같은.
list() 나 copy 모듈 안의 copy나 얕은 복사임.
copy 모듕 안의 deepcopy가 깊은 복사임.
얄팍해서 거기까진 복사 못했구나 ㅋ
완벽히 모방
파이썬에선 자동으로 자료형이 할당되는데 혹시나 나중에 오류 생길까봐 사용자가 직접 정의하는 방식이 도입됨.
(변수명): (자료형) = (초기값) #초기값은 생략가능
a: int = 4
print(a)
리스트도
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]