TIL 26. 파이썬 List에 대하여(+위치에 따른 동작)

윤현묵·2021년 8월 18일
0

Python

목록 보기
6/7
post-thumbnail

1. List란?

순서가 있는 수정 가능한 객체의 집합.
추가, 삭제, 수정이 가능하며 대괄호([])로 구분이 되고, 리스트 안의 값들은 콤마(,)로 구분됩니다.

2. List 생성

a = [] #빈 리스트 생성
a = [1, 2, 3, 4] #[1, 2, 3, 4] 리스트 생성

3. List의 특정 위치 값 확인(인덱스)

맨 앞의 인덱스 0번부터 차례로 증가합니다.

a = [1, 2, 3, 4]
a[0] = 1
a[3] = 4

4. List 값 수정

수정할 값의 인덱스를 지정하여 새로운 값 할당
append() 메소드를 사용하여 값 추가

a = [1, 2, 3, 4]
a[0] = 2
a = [2, 2, 3, 4]
a.append(5) # 값 5 추가
a = [2, 2, 3, 4, 5]

5. 위치에 따른 List 동작

반복문 내에 List를 사용할 때 주의할 점은 List를 생성해주는 위치입니다.
for문 내에 List를 생성해주는 a = []를 선언해주면 반복할 때마다 계속 초기화가 되는 과정을 거치기 때문에 list값을 다른 변수에 저장을 하거나 다른 방법을 통해 list의 값을 유지해주는 과정이 필요합니다.
아래는 2중 for문에서 dog_list를 첫 번째 for문 내에 선언하여 두 번째 for문에서 값을 넣어주는 코드입니다.
아래의 코드는 올바르게 작성되어 dog_list(리스트)의 값이 "dog_list"에 저장되어 올바르게 출력된 모습입니다.
하지만 dog_list가 두 번째 for문 내에서 생성이 될 경우, 에러가 발생하고(파이썬은 위에서부터 한줄씩 코드를 읽기 때문에 선언되지 않은 dog_list로 인해 에러가 발생) 실행이 된다고 하더라도 반복적으로 초기화되므로 마지막에 들어간 dog의 정보만 출력이 될 것입니다.
이러한 점에 주의하여 올바른 위치에 List를 선언하고, 필요에 따라 다른 변수를 선언하여 저장하며 사용해야합니다. 👍👍

(++++) 그리고 하나 더, 현재 작성된 코드를 보면, dog_list를 위에서 선언해주고, 값이 저장되는 변수 아래에서 반복문을 실행하고 있습니다. 때문에 처음에는 빈 리스트가 들어가고 반복이 되면서 값이 초기화되어 결국에는 빈 값이 출력되지 않을까??? 하는 생각을 했었습니다.

"얕은 복사와 깊은 복사"와 동일한 내용인데
얕은 복사의 경우 변수명은 달라지지만 실제 주소값은 동일하여 복사된 곳에 값을 변경하면 기존의 값도 변하는 것이고, 깊은 복사의 경우 주소값도 달라져 복사된 것을 변경하여도 기존 값이 변경되지 않은 것을 말합니다.

ex) a = [1, 2, 3]
b = a
a.append(5)
print(b) # [1,2,3,5]
print(a) # [1,2,3,5]

깊은 복사의 경우는 복합 객체를 새로 생성하고 그 안의 내용까지 재귀적으로 새롭게 생성하여, 참조 관계가 아니기 때문에 어느 쪽을 수정하던지 반대쪽에 영향을 끼치지 않습니다.

a = [1, [1, 2, 3]]
b = copy.deepcopy(a)
print(b) # [1, [1, 2, 3]]
b[0] = 100
b[1].append(4)
print(b) # [100, [1, 2, 3, 4]]
print(a) # [1, [1, 2, 3]]

아래의 리스트도 동일한 내용입니다.
"dog_list": dog_list 에서 주소 값이 할당된 것이고, 아래의 for문에서 dog_list.append가 되며 주소 값에 해당 정보가 append되기 때문에 위에 위치하고 있지만 dog_list의 값도 변하는 것입니다.(동일한 주소값을 가지고 있기 때문👍👍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def get(self, request):
        owners = Owner.objects.all()
        results = []
        for owner in owners:
            dog_list = []
            results.append(
                {
                    "owner": owner.name,
                    "owner_email": owner.email,
                    "owner_age": owner.age,
                    "dog_list": dog_list
                }
            )
            dogs = owner.dog_set.all()
            for dog in dogs:
                dog_list.append(
                    {
                        "dog_name": dog.name,
                        "dog_age": dog.age,
                    }
                )
 
        return JsonResponse({'results': results}, status=200)
cs

profile
진정성 있는 개발자를 꿈꾼다

0개의 댓글