본문으로 바로가기

[Python] 5. 리스트 슬라이스, 복사

category Programming/Python 2021. 12. 24. 23:00

5. 리스트

5.1 리스트 슬라이스

다음과 같은 형태로 사용합니다.

  • 리스트 이름[ x : y : z ]
  • x : 슬라이스 시작 인덱스
  • y : 슬라이스를 끝낼 위치(해당 위치는 포함 X)
  • z : 정해진 범위에서 해당 숫자만큼 건너뜀

y 값 바로 앞의 항목까지 슬라이스 하기 때문에, 자르고자 하는 위치에 +1을 한 값을 넣어주어야 합니다. 

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:5])
print(a[:4])
print(a[4:])
print(a[0:8:2])

>> 실행결과

[0, 1, 2, 3, 4]
[0, 1, 2, 3]
[4, 5, 6, 7, 8, 9]
[0, 2, 4, 6]

 

음수도 사용 가능합니다.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:-2])
print(a[-3:])

>> 실행결과

[0, 1, 2, 3, 4, 5, 6, 7]
[7, 8, 9]

 

5.2 리스트 복사

리스트를 복사할 때 슬라이스 형태를 사용합니다.

  • 새 리스트 이름 = 기존 리스트 이름[:]

기존 리스트를 슬라이스 하는데, 인덱스를 생략하면 됩니다.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[:]
print(a)
print(b)

>> 실행결과

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

왜 슬라이스를 이용하여 복사를 해야 하나 생각이 들 겁니다.

다음 코드를 보겠습니다.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a
print(a)
print(b)

>> 실행결과

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

실행결과를 보면 값이 똑같이 나옵니다.

이러면 슬라이스를 하지 않는 것이 효율적으로 보일 수 있습니다.

하지만 다음 코드를 보면 이유가 나옵니다.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = a[:]
c = a

c[0] = 10000

print(a)
print(b)
print(c)

>> 실행결과

[10000, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10000, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

리스트 b는 a를 슬라이스 하여 복사하였고,

리스트 c는 a를 슬라이스 하지 않고 복사하였습니다.

c[0] = 10000을 통해 리스트 c 0번 항목 값을 변경하였습니다.

그리고 각각 리스트를 출력해보면, 리스트 a와 c 값이 같은 것을 볼 수 있습니다.

왜 리스트 a는 변경하지 않았지만 값이 수정되었을까요?

슬라이스를 하지 않고 리스트 이름을 통해 복사를 하게 되면,

값을 넘겨주는 것이 아닌 리스트가 저장된 메모리 주소를 넘겨주게 됩니다.

위와 같은 상황에서는 c라는 변수에 a라는 변수가 가진 메모리 주소를 넘겨주게 되어

변수 c와 a가 같은 위치를 가리키고 있게 됩니다.

 

따라서, 리스트 c만 변경하였어도 리스트 a에도 반영이 됩니다.