파이썬에서 "."와 "+=[]"의 차이점은 무엇입니까?
다음의 차이점은 무엇입니까?
some_list1 = []
some_list1.append("something")
그리고.
some_list2 = []
some_list2 += ["something"]
귀사의 경우 유일한 차이점은 성능입니다. 추가 속도가 2배 더 빠릅니다.
Python 3.0 (r30:67507, Dec 3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.20177424499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.41192320500000079
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.23079359499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.44208112500000141
인 경우에는 인경우적일반▁in경우▁generalappend
목록에 하나의 항목을 추가하는 동안+=
오른쪽 목록의 모든 요소를 왼쪽 목록에 복사합니다.
업데이트: 성능 분석
바이트 코드를 비교하면 다음과 같이 가정할 수 있습니다.append
은 버은사을낭다니합비의 합니다.LOAD_ATTR
+CALL_FUNCTION
= 및 += 전 -- -BUILD_LIST
보하니아▁apparent.BUILD_LIST
보다 요한s가 더 중요합니다.LOAD_ATTR
+CALL_FUNCTION
.
>>> import dis
>>> dis.dis(compile("s = []; s.append('spam')", '', 'exec'))
1 0 BUILD_LIST 0
3 STORE_NAME 0 (s)
6 LOAD_NAME 0 (s)
9 LOAD_ATTR 1 (append)
12 LOAD_CONST 0 ('spam')
15 CALL_FUNCTION 1
18 POP_TOP
19 LOAD_CONST 1 (None)
22 RETURN_VALUE
>>> dis.dis(compile("s = []; s += ['spam']", '', 'exec'))
1 0 BUILD_LIST 0
3 STORE_NAME 0 (s)
6 LOAD_NAME 0 (s)
9 LOAD_CONST 0 ('spam')
12 BUILD_LIST 1
15 INPLACE_ADD
16 STORE_NAME 0 (s)
19 LOAD_CONST 1 (None)
22 RETURN_VALUE
는 제를통해성더향수있다습니킬상시욱능거을▁removingance▁even다▁we▁perform를 제거함으로써 성능을 더욱 향상시킬 수 있습니다.LOAD_ATTR
오버헤드:
>>> timeit.Timer('a("something")', 's = []; a = s.append').timeit()
0.15924410999923566
>>> a=[]
>>> a.append([1,2])
>>> a
[[1, 2]]
>>> a=[]
>>> a+=[1,2]
>>> a
[1, 2]
추가는 목록에 하나의 요소를 추가합니다. 이 요소는 무엇이든 될 수 있습니다. +=[]
목록에 추가합니다.
제시한 예제에서는 출력 측면에서 다음과 같은 차이가 없습니다.append
그리고.+=
하지만 사이에는 차이가 있습니다.append
그리고.+
(이 질문은 원래 질문에 대한 것이었습니다)
>>> a = []
>>> id(a)
11814312
>>> a.append("hello")
>>> id(a)
11814312
>>> b = []
>>> id(b)
11828720
>>> c = b + ["hello"]
>>> id(c)
11833752
>>> b += ["hello"]
>>> id(b)
11828720
당신이 볼 수 있듯이.append
그리고.+=
새 목록을 생성하지 않고 목록에 항목을 추가합니다.용사를 합니다.+
두 개의 목록을 추가하고 새 목록을 생성합니다.
과제입니다.당신이 그것을 사용할 때 당신은 정말로 'some_list2= some_list2+['something']'이라고 말하는 것입니다.할당에는 재바인딩이 포함되므로 다음과 같습니다.
l= []
def a1(x):
l.append(x) # works
def a2(x):
l= l+[x] # assign to l, makes l local
# so attempt to read l for addition gives UnboundLocalError
def a3(x):
l+= [x] # fails for the same reason
+= 운영자는 일반적으로 list+list가 일반적으로 하는 것처럼 새 목록 개체를 만들어야 합니다.
>>> l1= []
>>> l2= l1
>>> l1.append('x')
>>> l1 is l2
True
>>> l1= l1+['x']
>>> l1 is l2
False
그러나 실제로는:
>>> l2= l1
>>> l1+= ['x']
>>> l1 is l2
True
이는 Python 목록이 __add__()을 구현하여 += 증강 할당 단락을 만들고 대신 call list.call을 만들기 때문입니다.(이것은 약간 이상한 사마귀입니다: 그것은 보통 당신이 의미했던 것을 하지만 혼란스러운 이유 때문입니다.)
일반적으로 기존 목록을 추가/확장하는 경우 (새 목록을 만드는 대신) 동일한 목록에 대한 참조를 유지하려면 명시적으로 지정하고 append()/extend() 메서드를 사용하는 것이 가장 좋습니다.
some_list2 += ["something"]
사실은
some_list2.extend(["something"])
하나의 값에 대해서는 차이가 없습니다.설명서에는 다음이 명시되어 있습니다.
s.append(x)
과 같은s[len(s):len(s)] = [x]
s.extend(x)
과 같은s[len(s):len(s)] = x
그러므로 분명히s.append(x)
과 같습니다.s.extend([x])
차이점은 연결은 결과 목록을 평평하게 만드는 반면 추가는 수준을 그대로 유지한다는 것입니다.
예를 들어 다음과 같습니다.
myList = [ ]
listA = [1,2,3]
listB = ["a","b","c"]
append를 사용하면 다음과 같은 목록이 나타납니다.
>> myList.append(listA)
>> myList.append(listB)
>> myList
[[1,2,3],['a','b','c']]
대신 concontate를 사용하면 플랫 목록이 나타납니다.
>> myList += listA + listB
>> myList
[1,2,3,"a","b","c"]
여기서의 성능 테스트는 올바르지 않습니다.
- 프로필을 한 번만 실행하면 안 됩니다.
- 비교하면
append
대.+=[]
여러 번, 당신은 선언해야 합니다.append
국부적인 기능합니다. - 시간 결과는 64비트와 32비트의 파이썬 버전마다 다릅니다.
예.
timeit.Timer('for i in xrange(100): app(i)', 's = [] ; app = s.append').timeit()
좋은 테스트는 여기에서 찾을 수 있습니다: Python list append vs. +=[]
다른 답변에 설명된 측면 외에도 목록 목록을 작성할 때 추가 및 +[] 동작이 매우 다릅니다.
>>> list1=[[1,2],[3,4]]
>>> list2=[5,6]
>>> list3=list1+list2
>>> list3
[[1, 2], [3, 4], 5, 6]
>>> list1.append(list2)
>>> list1
[[1, 2], [3, 4], [5, 6]]
list1+['5','6']은 list1에 '5'와 '6'을 개별 요소로 추가합니다.list1.dll(['5','6'])은 list1에 ['5','6']을 단일 요소로 추가합니다.
다른 답변에서 언급한 재결합 행동은 특정 상황에서 중요합니다.
>>> a = ([],[])
>>> a[0].append(1)
>>> a
([1], [])
>>> a[1] += [1]
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
개체가 제자리에서 변형되더라도 증강된 할당은 항상 다시 바인딩되기 때문입니다.여기서 다시 결합하는 것은a[1] = *mutated list*
튜플에는 효과가 없습니다.
목록을 변경하지 않습니다.
.vmdk는 이전 목록을 변형합니다.
현재 Python 3.6을 기준으로 @Constantine에서 제공하는 결과는 더 이상 같지 않습니다.
Python 3.6.10 |Anaconda, Inc.| (default, May 8 2020, 02:54:21)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.0447923709944007
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.04335783299757168
는 것 같습니다.append
그리고.+=
이제 컴파일 차이는 전혀 변하지 않았지만 동일한 성능을 발휘합니다.
>>> import dis
>>> dis.dis(compile("s = []; s.append('spam')", '', 'exec'))
1 0 BUILD_LIST 0
2 STORE_NAME 0 (s)
4 LOAD_NAME 0 (s)
6 LOAD_ATTR 1 (append)
8 LOAD_CONST 0 ('spam')
10 CALL_FUNCTION 1
12 POP_TOP
14 LOAD_CONST 1 (None)
16 RETURN_VALUE
>>> dis.dis(compile("s = []; s += ['spam']", '', 'exec'))
1 0 BUILD_LIST 0
2 STORE_NAME 0 (s)
4 LOAD_NAME 0 (s)
6 LOAD_CONST 0 ('spam')
8 BUILD_LIST 1
10 INPLACE_ADD
12 STORE_NAME 0 (s)
14 LOAD_CONST 1 (None)
16 RETURN_VALUE
먼저 예를 들어 보겠습니다.
list1=[1,2,3,4]
list2=list1 (that means they points to same object)
if we do
list1=list1+[5] it will create a new object of list
print(list1) output [1,2,3,4,5]
print(list2) output [1,2,3,4]
but if we append then
list1.append(5) no new object of list created
print(list1) output [1,2,3,4,5]
print(list2) output [1,2,3,4,5]
extend(list) also do the same work as append it just append a list instead of a
single variable
append() 메서드는 기존 목록에 단일 항목을 추가합니다.
some_list1 = []
some_list1.append("something")
그래서 여기서 some_list1은 수정될 것입니다.
업데이트됨:
+를 사용하여 확장과 유사한 기존 목록의 목록 요소(둘 이상의 요소)를 결합합니다(플럭스에 의해 수정됨).
some_list2 = []
some_list2 += ["something"]
some_list2와 ["something"]은 결합된 두 개의 목록입니다.
언급URL : https://stackoverflow.com/questions/725782/in-python-what-is-the-difference-between-append-and
'source' 카테고리의 다른 글
참조가 아닌 값별 파이썬 목록 (0) | 2023.05.25 |
---|---|
ADT 22로 업그레이드한 후 라이브러리가 APK에 더 이상 추가되지 않음 (0) | 2023.05.25 |
스크립트에서 stderr과 stdout을 동일한 줄에 있는 다른 파일로 리디렉션하는 방법은 무엇입니까? (0) | 2023.05.25 |
Git 병합 오류 (0) | 2023.05.25 |
log4net을 어떻게 구성하면 로그가 생성됩니다.DebugEnabled가 참입니까? (0) | 2023.05.25 |