파이썬에서 객체를 비교할때 될때 두가지 방법이 있다.
value1 == value2
value1 is value2
두개는 다르다 .
value1 is value2
변수 value1 과 value2 가 참조하는 객체의 내용이 같은가 ?
value == value2
변수 value1 과 value2 가 참조하는 객체는 동일 객체인가??
라는 내용이다.
test1 = [1,2,3]
test2 = [1,2,3]
print(test1 is test2) # test1 과 test2 가 참조하는 객체는 같은 객체인가?
# False
print(test1 == test2) # test1 과 test2 가 참조하는 객체에 담긴 값은 같은가 ??
# True
>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
4396179528
>>> id(b)
4393788808
>>> a == b
True
>>> a is b
False
>>> b[0] = 5
>>> a
[1, 2, 3]
>>> b
[5, 2, 3]
위 a , b 에서는 b 의 index 0 에 5라는 값을 넣기전까지는
a 와 b 의 값은 같다
하지만 둘의 참조하는 주소는 다르게 된다.
print(id(a)) , print(id(b)) 둘의 주소값은 다르다 .
깊은 복사는 내부에 객체들까지 모두 새롭게 copy 됩니다.
import copy
a = [[1,2] , [3,4]]
b = copy.deepcopy(a)
a[1].append(5)
print(a) # [[1,2] , [3,4,5]]
print(b) # [[1,2] , [3,4]]
자바스크립트도 마찬가지다 .
내용만을 복사하느냐 , 아니면 참조와 내용 모두 복사하느냐
const a = 100;
b = a;
b = 200
console.log(a); //100
console.log(b); //200
const obj = {
a : 1 ,
b : {
c : 2 ,
},
};
const copiedObj = {...obj}
copiedObj.b.c = 3
obj === copiedObj // false
obj.b.c === copiedObj.b.c // true
깊은 복사는 객체의 요소 값 뿐만 아니라 참조하는 주소까지 모두 같은 복사를 의미한다.
lodash 라이브러리를 사용해야한다.
const obj = {
a : 1 ,
b : {
c : 2 ,
},
};
const copiedObj = _.cloneDeep(obj);
copiedObj.b.c = 3
obj.b.c === copiedObj.b.c // false