def ex1():
series = []
def average(a):
series.append(a)
print("inner >>> {} / {}".format(series, len(series)))
return sum(series) / len(series)
return average
avg_1 = ex1()
print(avg_1(15))
print(avg_1(35))
print(avg_1(40))
이거는 되는데
def ex2():
abc = 0
total = 0
def average(b):
abc += 1
total += b
return total / abc
return average
avg_2 = ex2()
print(avg_2(15))
print(avg_2(35))
print(avg_2(40))
이거는 왜 안되는고야??
밑에꺼는 def average의 스코프가 엄마함수 abc 못불러와서 그런거고
위에꺼는 def average의 스코프가 엄마함수 series를 막 불러오는게 됌???
해당 댓글은 삭제되었습니다.
수나 튜플은 이뮤터블이라 수정이 안 된다. 대입은 다른 객체를 대입하는 것이지 원래 값을 수정하고 있는 게 아님. 리스트는 이뮤터블이라 수정이 된다. 그래서 append로 조작이 된다.
average 함수 안에서 series = [100] 이런 식으로 새로운 리스트를 대입해보면 결과는 아래쪽 코드처럼 series에 변화 없음.
local variable 'abc' referenced before assignment 밑에꺼 오류가 아예 지역변수 abc가 선언전에 참조되었다고 나왔으니 아예 위에꺼를 못읽어오는거 아닌가요?? 반면에 위에꺼는 series를 위에서 잘 불러온게 이해가 안됩니다. 이뮤터블 개념하고는 좀 다른거 같아서요.
클로저 때문입니다
abc += 3이면 abc = abc + 3 같은 취급이잖아 즉 할당인데 파이썬에서 안쪽 스코프에서 같은이름으로 할당하면 로컬변수 취급임 nonlocal abc 해야함
수정은 되는데 할당은 안돼서 수정인 위 예제는 되고 할당인 아래예제는 안되는거
아 글쿠나.. 부모함수 변수하고 자식함수 변수 둘다 있으면 클로저를 통해 위에꺼를 안가져와서 오류가 발생하는구나... 위의 리스트는 부모함수 리스트를 할당이 아니라 클로저를 통해서 가져올 수 있고.. 내가 이해한게 맞나요???