programing

목록 초기화용 이 코드가 목록을 서로 링크하는 이유는 무엇입니까?

copyandpastes 2022. 10. 19. 21:38
반응형

목록 초기화용 이 코드가 목록을 서로 링크하는 이유는 무엇입니까?

n길이의 리스트를 초기화하려고 합니다.

x = [[]] * n

그러나, 이것은 어떻게든 리스트를 서로 연결시킨다.

>>> x = [[]] * 3
>>> x[1].append(0)
>>> x
[[0], [0], [0]]

저는 다음과 같은 것을 기대하고 있습니다.

[[], [0], []]

좋은 생각 있어요?

문제는 기억 속에 있는 모든 목록이 똑같다는 거예요.를 사용하는 경우[x]*n구문은 다음과 같습니다.n많이x모두 같은 오브젝트에 대한 참조입니다.뚜렷한 예는 아니지만n같은 인스턴스에 대한 참조.

3개의 다른 리스트를 작성하려면 , 다음의 순서에 따릅니다.

x = [[] for i in range(3)]

이를 통해 3개의 개별 인스턴스가 제공됩니다.[]그게 네가 원하는 거야

[[]]*n와 유사하다

l = []
x = []
for i in range(n):
    x.append(l)

하는 동안에[[] for i in range(3)]는 다음과 같습니다.

x = []
for i in range(n):
    x.append([])   # appending a new list!

In [20]: x = [[]] * 4

In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object


In [22]: x=[[] for i in range(4)]

In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time

언급URL : https://stackoverflow.com/questions/12791501/why-does-this-code-for-initializing-a-list-of-lists-apparently-link-the-lists-to

반응형