1. 할당 방법 6가지
(1) 기본할당문
a = 23
# a : 식별자(identifier) / 이름(name)
# = : 할당 연산자(binding, assignment operator)
# 23 : 값(value)
(2) 복합할당문
- 두 식별자에 하나의 값으로 동시에 할당
- immutable container: 왼쪽에서오른쪽으로 하나씩 값 대입
재할당시 영향 안 줌
b=c=2 #immutable : b만 변함
b=3
b ==> 3
c ==> 2
- mutable container : object reference( 같은 메모리 주소 공유)
동시에 변함
c=d=[1,2,3] #mutable : c&d 같이 변함
c.append(4)
d ==> [1, 2, 3, 4]
(3) Unpacking
- n개의 식별자와 n개의 값으로 각각 1개씩 할당
- 식별자 갯수 = 값 갯수 동일
x,y = 1,2
x ==> 1
y ==> 2
x,y= 1,2,3 # Value Error 갯수 동일하지 않는경우
- unpacking에서 swapping : 각 할당 값 swap
x,y=y,x
x ==> 2
(4) Starred 할당문
- *:나머지 할당 (가변적 형태이므로 리스트)
- unpacking에서 식별자앞에 *를 붙이면 좌우변의 개수가 달라도 value에러가 발생하지 않고 해당 식별자에 나머지 할당
- * 나머지 값만 할당 받으므로 단독을 사용 불가(기본할당이므로)
x,*y=1,2,3 #list :가변성 문제로 나머지 할당
x ==> 1
y ==> [2,3]
type(y) ==> list
*x=1,2,3 #1개는 불가
x
==>SyntaxError: starred assignment target must be in a list or tuple
# trailing comma 이용하면 tuple -> list 로 변환하면서 가능해짐
*x , =1,2,3
x ==> [1, 2, 3]
(5) 증감할당문
- 이전에 할당이 된 식별자에 한해서 추가/제거 하여 증감시킬수 있음
xx=2
xx +=1
xx ==> 3
xx*=3
xx ==> 9
++xx # 부호로 간주, 에러 없음
x++ #SyntaxError: invalid syntax
(6) Global , Nonlocal
- information hididng 값 숨기기 위해 사용
- 외부에서는 내부 접근 불가
- 내부에서는 외부 접근 가능
- class : 기본이 퍼블릭,
- function: 다른 영역에서 관리됨
# 식별자가 1개인 경우 문제 없음
def dd():
xx=1
return xx
xx ==> 1
#식별자가 2개인 경우 내부 식별자 사용
xx=1
def dd():
xx=2
return xx
dd() ==> 2
xx=1
def dd():
xx=xx+2
return xx
dd()
==> UnboundLocalError: local variable 'xx' referenced before assignment
#global 로 연결(연동) , 객체지향에서는 안 좋음 xx=1+2
xx=1
def dd():
global xx
xx=xx+2
return xx
dd() ==> 3
2. Scoping Rule
- 식별자의 가능범위로 dynamic scoping으로 LEGB순
- LEGB :
namespace: 각 객체에 매핑된 이름이 있는 컨테이너
다른 네임스페이스에서 같은 이름 존재시에 confusion피하기 위해 생긴 룰
local : 함수 내부
enclosing : 함수 내포하는 또 다른 함수 공간
global :함수 외부 공간
built-in scope:내장영역
# 함수 중첩시 식별자 x 가 여러개 인경우 local x=3 리턴
x=1
def a():
x=2
def b():
x=3
return x
return b()
a() ==> 3
# 함수 중첩시 식별자 x 가 여러개 인경우 enclosing x=2 리턴
x=1
def a():
x=2
def b():
return x
return b()
a() ==> 2
# 함수 중첩시 식별자 global x=1 리턴
x=1
def a():
def b():
return x
return b()
a() ==> 1
# Global, Nonlocal 이용
x=1 # global 영역 :x=1 +3
def a():
x=2#
def b():
global x
x= x+3
return x
return b()
a() ==> 4
x=1
def a():
x=2 #nonlocal영역 x=2+3
def b():
nonlocal x
x= x+3
return x
return b()
a() ==> 5
3. 재할당
- rebinding, reassignemnt
- 이미 할당받은 이름/식별자를 다른 값으로 할당함
- immutable/ mutable container 에 따라 주의 필요
# immutable type: 재할당시 영향 안줌
a=1
b=c=2
c=3
print(' b is ',b, '\n c is ',c)
==> b is 2
c is 3
#Mutable type: 재할당시 영향 줄수 있어 주의 해야함
d=e= [1,2]
e.append(3)
print(' e is ',e, '\n d is ',d)
==> e is [1, 2, 3]
d is [1, 2, 3]