Variables


Variables

  • 변수 a는 객체가 저장된 메모리의 위치를 가리키는 레퍼런스(Reference)
>>> a = 3
>>> type(3)
<class 'int'>

>>> b = 3
>>> a is b
True

다양한 변수 생성 방법

  • 튜플로 a, b에 값을 대입
    >>> a, b = ('python', 'life')
    
  • 튜플은 괄호를 생략해도 됨
    >>> (a, b) = 'python', 'life'
    
  • 리스트로 변수 생성
    >>> [a,b] = ['python', 'life']
    
  • 여러 개의 변수에 같은 값 대입

    >>> a = b = 'python'
    
  • Example) 값 바꾸기

    >>> a = 3
    >>> b = 5
    >>> a, b = b, a
    
  • if else

    a, b = 0, 1
    s = "Less than" if a < b else "not less than"
    

메모리에 생성된 변수 없애기

a=3을 입력하면 3이라는 정수형 객체가 메모리에 생성된다고 했다. 그렇다면 이 값을 메모리에서 없앨 수 있을까? 3이라는 객체를 가리키는 변수들의 개수를 레퍼런스 카운트라고 하였는데, 이 레퍼런스 카운트가 0이 되는 순간 3이라는 객체는 자동으로 사라진다. 즉, 3이라는 객체를 가리키고 있는 것이 하나도 없을 때 3이라는 객체는 메모리에서 사라지게 되는 것이다. 이것을 어려운 말로 가비지 콜렉션(Garbage collection, 쓰레기 수집)이라고도 한다.

다음은 특정한 객체를 가리키는 변수를 없애는 예이다.

>>> a = 3
>>> b = 3
>>> del(a)
>>> del(b)

위의 예를 살펴보면 변수 a와 b가 3이라는 객체를 가리켰다가 del이라는 파이썬 내장 함수에 의해서 사라진다. 따라서 레퍼런스 카운트가 0이 되어 정수형 객체 3도 메모리에서 사라지게 된다.

(※ 사용한 변수를 del 명령어를 이용하여 일일이 삭제할 필요는 없다. 파이썬이 이 모든 것을 자동으로 해주기 때문이다.)

List의 복사

>>> a = [1,2,3]
>>> b = a
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]

앞의 예를 유심히 살펴보면 b라는 변수에 a가 가리키는 리스트를 대입하였다. 그런 다음 a 리스트의 a[1]을 4라는 값으로 바꾸면 a 리스트만 바뀌는 것이 아니라 b 리스트도 똑같이 바뀐다. 그 이유는 a, b 모두 같은 리스트인 [1, 2, 3]을 가리키고 있었기 때문이다. a, b는 이름만 다를 뿐이지 완전히 동일한 리스트를 가리키고 있는 변수이다.

그렇다면 b 변수를 생성할 때 a와 같은 값을 가지도록 복사해 넣으면서 a가 가리키는 리스트와는 다른 리스트를 가리키게 하는 방법은 없을까? 다음의 2가지 방법이 있다.

  • 방법 1 - ':' 이용

    >>> a = [1, 2, 3]
    >>> b = a[:]
    >>> a[1] = 4
    >>> a
    [1, 4, 3]
    >>> b
    [1, 2, 3]
    
  • 방법 2 - copy 모듈 이용

    >>> from copy import copy
    >>> b = copy(a)
    >>> b is a
    False
    

    b = copy(a)는 b = a[:]과 동일

  • 참고 Note that items in the sequence s are not copied; they are referenced multiple times. This often haunts new Python programmers.

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

    What has happened is that [[]] is a one-element list containing an empty list, so all three elements of [[]] * 3 are references to this single empty list. Modifying any of the elements of lists modifies this single list. You can create a list of different lists this way:

    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
    

results matching ""

    No results matching ""