본문 바로가기

PYTHON

할당

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]

 

'PYTHON' 카테고리의 다른 글

Functional Programming  (0) 2020.11.12
예외 처리문  (0) 2020.11.12
PEP  (0) 2020.11.06
파이썬 프로그래밍  (0) 2020.11.05
자료형  (0) 2020.11.04