인프런 커뮤니티 질문&답변
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
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





