728x90
- 리스트의 얕은 복사(shallow copy)/ 깊은 복사
https://suwoni-codelab.com/python%20%EA%B8%B0%EB%B3%B8/2018/03/02/Python-Basic-copy/
mutable 과 immutable 을 구분
단순 객체복제
a=[1,2,3,4]
b=a
print(a,"/",b) #[1, 2, 3, 4] / [1, 2, 3, 4]
b[1]=100
print(a,"/",b) #[1, 100, 3, 4] / [1, 100, 3, 4]
단순하게 a와 b가 똑같아 지는 복제
얕은 복사(shallow copy)
a=[1,2,3,4]
b=a[:]
print(a,"/",b) #[1, 2, 3, 4] / [1, 2, 3, 4]
b[1]=100
print(a,"/",b) #[1, 2, 3, 4] / [1, 100, 3, 4]
print(id(a),"/",id(b)) #139942331316896 / 139942263856976
b = a.copy()
print(a,"/",b) #[1, 2, 3, 4] / [1, 2, 3, 4]
b[1]=1000
print(a,"/",b) #[1, 2, 3, 4] / [1, 1000, 3, 4]
print(id(a),"/",id(b)) #139942331316896 / 139942331291120
얕은복사(shallow copy)는 복합객체만 복사, 그 내용은 동일한 객체
즉, 내용만 복사하고 다른 변수
그래서 이 경우,
a=[1,[2,3,4]]
b=a[:]
print(a,"/",b) #[1, [2, 3, 4]] / [1, [2, 3, 4]]
b[0]=100
b[1].append(5)
print(a,"/",b) #[1, [2, 3, 4, 5]] / [100, [2, 3, 4, 5]]
print(id(a),"/",id(b)) #139942262800544 / 139942262504736
b = a.copy()
print(a,"/",b) #[1, [2, 3, 4, 5]] / [1, [2, 3, 4, 5]]
b[0]=1000
b[1].append(6)
print(a,"/",b) #[1, [2, 3, 4, 5, 6]] / [1000, [2, 3, 4, 5, 6]]
print(id(a),"/",id(b)) #139942262800544 / 139942330999424
이처럼 리스트안에 리스트 mutable객체 안에 mutable객체인 경우 문제가 발생
깊은 복사(deep copy)
import copy
a=[1,2,3,4]
b=copy.deepcopy(a)
print(a,"/",b) #[1, 2, 3, 4] / [1, 2, 3, 4]
b[1]=100
print(a,"/",b) #[1, 2, 3, 4] / [1, 100, 3, 4]
print(id(a),"/",id(b)) #139942263856896 / 139942330999424
복합객체 복사 + 그 내용도 재귀적으로 복사
a=[1,[2,3,4]]
b=copy.deepcopy(a)
print(a,"/",b) #[1, [2, 3, 4]] / [1, [2, 3, 4]]
b[0]=100
b[1].append(5)
print(a,"/",b) #[1, [2, 3, 4]] / [100, [2, 3, 4, 5]]
print(id(a),"/",id(b)) #139942262686016 / 139942262501776
이렇게 리스트안의 mutable객체 안의 mutable객체 또한 해결
- 지역 변수와 전역 변수
지역 변수와 전역 변수의 스코프를 잘 파악해야한다.
- 코딩테스트에 쓰일 만한 함수들
enumerate(iterable객체) - iterable한 객체의 인덱스와 함께 뽑아준다.
for i, name in enumerate(['a', 'b', 'c']):
print(i, name)
#0 a
#1 b
#2 c
filter(규칙,대상) - 인자로 규칙과 대상을 넣어 걸러서 뽑아내는 것이 가능.
def even(x):
return x % 2 == 0
print(list(filter(even, [1, 2, 3, 4, 5, 6])))
#[2, 4, 6]
lambda 사용
print(list(filter(lambda x: x%2==0, [1, 2, 3, 4, 5, 6])))
#[2, 4, 6]
map(규칙,iterable객체) - iterable객체에 규칙을 적용한다.
def twop(x):
return x + 2
print(list(map(twop, [1, 2, 3, 4, 5, 6])))
#[3, 4, 5, 6, 7, 8]
lambda 사용
print(list(map(lambda x:x+2, [1, 2, 3, 4, 5, 6])))
#[3, 4, 5, 6, 7, 8]
int() - 정수로 변환 시켜준다.
하지만 내가 알던건 아스키코드의 변형과 숫자 문자열의 변환이였는데
인자로 (int(x,2)/int(x,16)) 처럼 2, 16을 받아 문자열을 2진수로 생각하고 정수로 변환하거나 16진수로 생각하고 정수로 변환시키는 기능도 가능했다.
print(int("100",2)) #4
print(int("14",16)) #20
print(int("1A",16)) #26
dir() - 객체를 인자로 받아 객체에서 사용할 수 있는 함수를 보여준다.
print(dir(1)) #['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
print(dir("a")) #['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
print(dir([1,2,3])) #['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
print(dir({1:"a",2:"b",3:"c"})) #['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']