대대로 문자열은 리스트와 비슷한 구석이 많았다... 자바의 스트림.. C의 char 타입...
문자열을 리스트의 형태로 메모리에 저장하는 방식을 많이 사용해 왔기에 서로 호환되는 부분이 많이 존재한다!
그런데!! 차이점도 존재한다.
오늘은 이에 대해서 알아보자!
Aliasing
가명 혹은 가짜이름표라 불리는 alias는 메모리 참조 문제때문에 일어난다.
갑자기 왜 문자열보다가 이게 나오냐고?
문자열을 다루려면 메모리 개념을 조금 알아야 하기 때문이다!
x= 5
y = x
y = 3
print(x) #5
print(y) #3
위의 코드와 같이 y에 x를 할당하고, y의 값을 변경해도, x의 값이 변하지 않는다.
x= [2,3,5,7,11]
y = x
y[2] = 4
print(x) #[2,3,4,7,11]
print(y) #[2,3,4,7,11]
하지만.. 이 경우엔 조금 문제가 생긴다.. 차근차근 알아보자!
첫 번째 코드에서, y = x 를 하면, 숫자형 데이터 5에 y란 꼬리표가 붙는다.
그런데!! y = 3 을 해줌으로써, 3이란 데이터에 y란 이름표가 새로이 달리게 된다.
즉 x의 근본적인 데이터를 건들지 않는 것이다.
하지만,,, 리스트의 경우 참조형 객체이기 때문에 객체의 주소를 y에 할당한다.
따라서, y[2] = 4로 초기화 해 버린다면, x가 바라보고있는 주소의 리스트 또한 변경되게 된다.
이런 문제를 방지하려면 어떻게 해야할까?
앞서 알아본 list()함수를 이용해야한다!
x= [2,3,5,7,11]
y = list(x)
y[2] = 4
list함수는 새로운 리스트를 리턴해주기 때문에 이 상태에선 x와 y가 서로 다른 리스트의 주소를 바라본다.
따라서 이 경우에 우리가 y[2] = 4 로 변경을 하더라도
x가 바라보는 리스트의 데이터는 변하지 않는다!
리스트와 문자열
앞서 말했듯이 리스트는 문자열과 비슷한 구조를 가진다.
문자열은 문자를 나열, 리스트는 데이터를 나열한다.
1. 리스트의 인덱스처럼, 문자열도 인덱싱 할 수 있음.
string_ = "hello"
string_[0] #h
string_[1] #e
...
string_[0:5] # hello
2. 문자열을 연결하듯, 리스트도 연결할 수 있음
list1 = [0,1,2]
list2 = [3,4,5]
list_ = list1 + list2
print(list_) # [0,1,2,3,4,5]
3. 리스트의 길이를 len으로 구하듯, 문자열의 길이도 len으로 구할 수 있음.
list_ = [1,2,3]
print(len(list_)) # 3
string_ = "hello"
print(len(string_)) # 5
차이점
하지만, 서로 다른 자료형인 이유가 존재한다.
리스트는 데이터를 변경할 수 있지만, 문자열은 데이터를 변경할 수 없다.
리스트와 같이 수정 가능한 자료형을 'mutable'한 자료형이라고 부르고, 문자열과 같이 수정 불가능한 자료형을 'immutable'한 자료형이라고 부른다.
**숫자, 불린, 문자열은 모두 immutable한 자료형입니다.
1. 리스트
number = [0,1,2]
number[0] = 5
#[5,1,2]
2. 문자열
name = 'hwany'
name[0] = 'c'
print(name) ## error 발생!
Traceback (most recent call last):
File "untitled.py", line 3, in <module>
name[0] = "C"
TypeError: 'str' object does not support item assignment
3. 문자열 수정이 아닌 생성
name = 'hwany' + ' hello'
#이거는 가능! -> 문자열을 합쳐서 새로운 문자열을 만든 것이기 때문
Garbage Collector
# case1 print(id(numbers[1:2])) print(id(numbers[2:3])) print(id(numbers[0:1])) # case2 a = numbers[1:2] b = numbers[2:3] c = numbers[0:1] print(id(a)) print(id(b)) print(id(c))
위 코드를 실행할 때 마다...
140553129491712 140553129521856 140553129521856 140553129521856 140553129521792 140553129521984
139732436974784 139732437004928 139732437004928 139732437004928 139732437004864 139732437005056
139755037748416 139755037778560 139755037778560 139755037778560 139755037778496 139755037778688
이렇게 값이 바뀜!
메모리 주소를 사용 하고나서 메모리주소를 반납하기때문에. 이를 garbage collector가 자동으로 수행해준다.
고된 일주일이 끝나고... 휴일인 일요일도 다 끝나간다.. 이제 곧 근무자 보고도 하고 내일 또 취사지원이니
새벽 5시에 기상해야 한다.. 그래도 취사지원하면 근무 제외해주니까!
좀 쉴 수 있겠다 ㅎㅎ 내일도 열심히 공부해야지! 파이팅!
2021-09-12
'Language > Python' 카테고리의 다른 글
9. 파이썬 상호작용 (0) | 2021.09.13 |
---|---|
8. 파이썬 모듈 (0) | 2021.09.13 |
6. 파이썬 딕셔너리 (0) | 2021.09.12 |
5. 파이썬 for 문 (0) | 2021.09.12 |
4. 파이썬 리스트 (0) | 2021.09.10 |