강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

돈가스날다님의 프로필 이미지
돈가스날다

작성한 질문수

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

일급함수 - 클로저 심화(3-1)

series nonlocal 안해도 되는 이유

작성

·

280

1

def closure_ex1():
# Free variable
# 클로저 영역
series = []

def averager(v):
# 여기는 nonlocal 안해도 되는 이유가 뭔가요?
series.append(v)
print(f'inner >>> {series} / {len(series)}')
return sum(series) / len(series)
return averager


avg_closure1 = closure_ex1()

print(avg_closure1(10))
print(avg_closure1(20))
print(avg_closure1(30))

averager 함수에서 series에 nonlocal 왜 안적어도 되는 건가요?

퀴즈

Điều nào sau đây có thể làm khi hàm là 'đối tượng hạng nhất'?

Có thể gán hàm cho biến.

Hàm luôn được khởi tạo khi biên dịch.

Hàm không thể là đối số của hàm khác.

Hàm chỉ có thể được định nghĩa bên trong lớp.

답변 3

0

series는 가변이라 불필요하다고 합니다 int string tuple등 불변일 경웅에만 nonlocal해주면 된다고하네요

0

메소드마다 로컬네임스페이스가 존재 해서 변수명이 같아도

다른걸로 본다고 압니다. 

(다른걸로 안보려면 nonlocal을 붙이고요)

그걸 증명하는 소스 입니다.

def funcIn():

x = 10
print('외부x_id:{}'.format(id(x)))

def funcOut():
x=20
print('내부x_id:{}'.format(id(x)))
print('내부x:{}'.format(x))

funcOut()
print('x:{}'.format(x))


x = funcIn()

외부 x와 내부 x의 id 값이 틀립니다.

근데 아래 소스로  돌려보면  메소드 안 의 sereis 변수의 id

값이 같습니다.

def testOut():

series = []
print('1.외부series:{}'.format(id(series)))
def testIn():
series.append(1)
print('--->내부series:{}'.format(id(series)))
print('--->내부series 의 값 {}'.format(series))

print('2.외부series:{}'.format(series))
return testIn


x = testOut()

print('========1========')
x()
print('========2========')
x()
print('========3========')
x()

 

왜 1번 소스와 2번 소스가 동작이 서로 틀린거죠?

1번 소스의 변수는 숫자형 primitive  이고

2번 소스는 list  형 객체라서 그런건가요?

답변 부탁 드립니다.

감사합니다.

 

 

 

0

좋은사람님의 프로필 이미지
좋은사람
지식공유자

클로저 영역에서 내부 변수는 일시적으로 기억됩니다.

뒷 부분에서 내부 영역 출력해보면 그 이유를 알수있어요

돈가스날다님의 프로필 이미지
돈가스날다

작성한 질문수

질문하기