09 - 변수심화

Last updated - 2023년 03월 10일 Edit Source

해당 게시글은 파이썬 입문과 크롤링기초 부트캠프 강의를 정리한 내용입니다.


# 01. 변수의 정확한 의미


변수 = 값의 형태로 계속 사용해왔다. =(대입연산자, assignment)는 우측의 값을 왼쪽 변수에 대입한다는 의미를 가진다. 조금 더 깊게 생각해보면, 파이썬은 모든 것을 객체로 다룬다고 했다.

쉽게 말해서, 우리가 지금까지 다뤄온 자료형은 객체라고 보면 된다. 값을 생성하는 과정을 통해 자료형(객체)가 메모리에 공간을 할당받는다. 그러면 변수가 값이 해당하는 메모리의 주소를 가리키게 된다.

마치, C언어의 포인터와 비슷한 느낌이다. 실제로 변수에 값이 저장되는 것이 아니라 값이 저장되어 있는 메모리의 주소를 가리킬 뿐이다. 이를 코드로 확인해보면,

1
2
3
4
5
6
7
8
a = [1, 2, 3]
print(id(a))
  
b = a
print(id(b))
  
출력결과 : 140539428263424
출력결과 : 140539428263424

a 변수에 리스트를 저장했고, a를 b에 대입한 것의 각각 메모리 주소를 확인해보면 동일한 것을 알 수 있다. 변수는 단지 메모리의 주소를 가리키는 것이기 때문이다.

1
2
3
4
5
a = [1, 2, 3]
b = a
print(a is b)
  
출력결과 : True

a is b가 뜻하는 바는 a와 b가 동일한 가 보다는 조금 더 정확하게 a와 b가 가리키는 객체가 동일한가?로 이해할 수 있다. 서로 가리키는 객체가 동일하기에 True가 반환된다. 이를 증명해보면,


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
a = [1, 2, 3]
b = a
  
a[1] = 4
  
print(a)
print(b)
  
출력결과 : [1, 4, 3]
출력결과 : [1, 4, 3]

a = [1, 2, 3]인 상태를 b에 대입하고 난 이후에 a의 인덱스 값을 바꿨다. 그 이후에 b를 출력해보면 b 역시 바뀐 것을 알 수 있다. 즉, a라는 공간에 리스트를 넣어서가 아닌, 리스트 객체가 저장된 메모리의 주소를 a가 가리키기 떄문에, 또 b가 가리키기 때문에 이런 결과가 나타나는 것이다.


# 02. 변수 다루기 응용


값을 가져오면서 주소는 다르게 변수 복사도 가능하다. 즉, A라는 객체의 값을 가져오면서 새로 생성한 B라는 객체에 A의 값을 넣겠다는 의미이다. A 객체의 값을 변경하더라도 B 객체는 애초에 다른 객체기 때문에 영향을 끼치지 않는다. 메모리 주소를 확인해봐도 주소가 다르다.


  • [:]을 사용하는 방법
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
a = [1, 2, 3]
b = a[:]
a[1] = 4
  
print(a)
print(b)
  
출력결과 : [1, 4, 3]
출력결과 : [1, 2, 3]
  
# 서로 다른 메모리를 가리키는 것을 확인 가능하다.
print(id(a))
print(id(b))
  
출력결과 : 140011803112896
출력결과 : 140011802234432

  • copy 모듈을 사용하는 방법
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from copy import copy

a = [1, 2, 3]
b = copy(a)

a[1] = 4
print(a)
print(b)
  
출력결과 : [1, 4, 3]
출력결과 : [1, 2, 3]
  
print(id(a))
print(id(b))
  
출력결과 : 139811777411136
출력결과 : 139811777409472

  • 리스트의 경우 copy() 함수 사용
1
2
3
4
5
6
7
8
9
a = [1, 2, 3]
b = a.copy()
a[1] = 4

print(a)
print(b)

출력결과 : [1, 4, 3]
출력결과 : [1, 2, 3]

  • 다른 객체를 가리키는지 확인하려면 그냥 is 쓰면 되기는 한다.
1
2
3
4
5
6
7
8
9
a = [1, 2, 3]
b = a.copy()
c = a
  
print(b is a)
print(c is a)
  
출력결과 : False
출력결과 : True

  • 변수 만들 때 변수 = 값 말고도 튜플, 리스트, 여러 개 대입 등도 가능하다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
a, b = ('hello', 'world')
[c, d] = ['I', 'am']
e = f = 3
  
print((a, b))
print([c, d])
print(e, f)
  
출력결과 : ('hello', 'world')
출력결과 : ['I', 'am']
출력결과 : 3 3

  • [잔재미] Tuple에서 설명한 내용인데 이를 이용하여 변수를 손쉽게 바꿀 수 있다. 파이썬의 강력한 특징이다.
1
2
3
4
5
6
7
a = 'hello'
b = 'world'

a, b = b, a
print(b, a)

출력결과 : hello world

Comment