답변:
당신은 또한 쓸 수 있습니다 :
[e] * n
e가 예를 들어 빈 목록 인 경우 n 개의 독립적 인 빈 목록이 아닌 동일한 목록에 대한 n 개의 참조가있는 목록을 얻게됩니다.
성능 시험
언뜻보기 에 반복은 n 개의 동일한 요소로 목록을 만드는 가장 빠른 방법 인 것 같습니다 .
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
그러나 기다려라-그것은 공정한 시험이 아니다 ...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
이 함수 itertools.repeat
는 실제로 목록을 만들지 않고 원하는 경우 목록을 만드는 데 사용할 수있는 객체를 만듭니다. 다시 시도하지만 목록으로 변환 해 보겠습니다.
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
따라서 목록을 원하면을 사용하십시오 [e] * n
. 요소를 느리게 생성하려면을 사용하십시오 repeat
.
[[]] * n
예기치 않은 결과가 발생할 수 있습니다. 고유 한 빈 하위 목록 을 만들려면 다음을 이해하십시오.[[] for i in range(0,n)]
Python에서 n 번 반복 된 단일 항목 목록 만들기
None, bool, int, float, string, tuples 또는 frozensets와 같은 불변 항목의 경우 다음과 같이 할 수 있습니다.
[e] * 4
메모리의 동일한 위치에서 동일한 항목을 가리 키므로 목록의 변경 불가능한 항목 (문자열, 튜플, 고정 집합 등)에만 사용하는 것이 가장 좋습니다. 모든 문자열의 스키마로 테이블을 작성해야 할 때 이것을 자주 사용하므로 중복성이 높은 일대일 매핑을 제공 할 필요가 없습니다.
schema = ['string'] * len(columns)
나는 오랫동안 파이썬을 사용해 왔으며 가변 인스턴스로 위의 작업을 수행하는 유스 케이스를 본 적이 없다. 대신 변경 가능한 빈 목록, 설정 또는 dict을 얻으려면 다음과 같이해야합니다.
list_of_lists = [[] for _ in columns]
밑줄은이 문맥에서 단순히 무시할 수있는 변수 이름입니다.
번호 만있는 경우 다음과 같습니다.
list_of_lists = [[] for _ in range(4)]
은 _
정말 특별하지 않다, 그러나 당신이 변수를 사용하여 다른 이름을 사용하지 않을 경우 코딩 환경 스타일 검사기는 아마 불평 할 것이다.
변경 가능한 객체를 사용 하여이 작업을 수행하십시오. 중 하나를 변경하면 모두 동일한 객체 이기 때문에 모두 변경됩니다 .
foo = [[]] * 4
foo[0].append('x')
foo는 이제 다음을 반환합니다.
[['x'], ['x'], ['x'], ['x']]
그러나 불변의 객체를 사용하면 객체가 아닌 참조를 변경하기 때문에 작동하게 할 수 있습니다.
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
그러나 다시 변경 가능한 객체는 내부 작업이 참조가 아닌 객체를 변경하기 때문에 좋지 않습니다.
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]