만약 아래 코드와 같이 b=a로 a를 복사하려고 한다면 a를 수정할 때 b도 같이 수정될 것이다.
실제 리스트는 1개만 존재하고 a, b라는 다른 이름으로 같은 값을 가르키게 되기 때문이다.
>>> a = [1,2,3,4]
>>> b = a
>>> print(b is a)
# True
>>> a.append(5)
>>> print("a: ", a)
>>> print("b: ", b)
# a: [1, 2, 3, 4, 5]
# b: [1, 2, 3, 4, 5]
리스트의 경우는 가변(mutable)객체이기 때문에 Shallow Copy를 이용해 복사해야 한다.
Immutable(불변성)
Mutable(가변성)
Type
int, float, bool, str, tuple
list, dict, set
>>> a = [1,2,3,4]
>>> b = a[:] # b = a.copy()
>>> print(b is a)
# False
>>> a.append(5)
>>> print("a: ", a)
>>> print("b: ", b)
# a: [1, 2, 3, 4, 5]
# b: [1, 2, 3, 4]
2차원: Deep Copy import copy list_copy = copy.deepcopy(list)
2차원 리스트는 Shallow Copy로 복사할 수 없다.
리스트 안의 요소가 리스트(가변 객체)이기 때문이다.
따라서 Deep Copy를 통해 객체의 변형성에 따라서, 불변형 객체는 그대로 가져오고 변형 객체는 새로운 공간에 값을 복사하여 가져오게 하여 두 객체는 같은 값을 가진 완전히 다른 객체가 된다.
>>> import copy
>>> a = [[802, 906],[216, 820]]
>>> b = copy.deepcopy(a)
print(b is a)
# False
>>> a[0][0] = 208
>>> print("a: ", a)
>>> print("b: ", b)
# a: [[208, 906], [216, 820]]
# b: [[802, 906], [216, 820]]
String & Advanced function concept
▮ raw string
특수문자 기호 '\'를 그대로 출력
>>> raw_string = "그대로 출력할 수 있다는 것이 사실입니까? \n 앞에 r을 붙여야함"
>>> print(raw_string)
# 그대로 출력할 수 있다는 것이 사실입니까?
# 앞에 r을 붙여야함
>>> raw_string = r"그대로 출력할 수 있다는 것이 사실입니까? \n 진짜임"
>>> print(raw_string)
# 그대로 출력할 수 있다는 것이 사실입니까? \n 진짜임
▮ call by object reference
함수에서 parameter 전달 방식
1. Call by value: 값만 넘김
2. Call by reference: 메모리 주소를 넘김 (parameter 값 변경 시 호출자의 값도 변경됨)
3. Python의 경우 Call by object reference: “객체의 주소”가 함수로 전달됨
전달된 객체를 참조해 변경 시 호출자에게 영향 줌
새로운 객체 생성 시 호출자에게 영향 주지 않음
▮ function type hints
파이썬은 dynamic typing이기 때문에 처음 함수를 사용하는 사용자가 interface를 알기 어렵다.
따라서 function을 정의할 때 파라미터의 type과 리턴값의 type을 명시하여 사용자가 쉽게 사용할 수 있다.
def temp(level: int) -> int:
return level+1
▮function docstring
함수에 대한 설명과 목적을 기술하는 것
def solution(survey, choices):
"""성격유형 지표 결과를 반환
Parameters:
survey (list) : 질문마다 판단하는 지표를 담은 1차원 문자열 배열
choices (list) : 질문마다 선택지를 담은 1차원 정수 배열
Returns:
answer (str) : 성격유형 검사 결과 지표 문자열
"""
...코드 생략...
return answer