2014-06-13 4 views
2

파이썬의 목록은 변경 가능하다고합니다. 나는 다음과 같은 코드를 작성할 때목록을 변경할 수 있습니까?

l1=[6,7,8,4,3,10,22,4] 
l2=l1 
l1.append(30) 
print(l1) 
print(l2) 

모두 L1 및 L2 인쇄에게 동일한 목록 : [6, 7, 8, 4, 3, 10, 22, 4, 30]

하지만 다음과 같은 코드를 줄 때,

l1=[6,7,8,4,3,10,22,4] 
l2=l1 
l1=l1+[30] 
print(l1) 
print(l2) 

l1 인쇄 ->[6, 7, 8, 4, 3, 10, 22, 4, 30]
l2 인쇄물 ->[6, 7, 8, 4, 3, 10, 22, 4]

그래서 지금 참조가 변경되었습니다. 그렇다면 파이썬의 목록은 실제로 변경 가능합니까?

답변

3

연산자가 변형자가 아니므로 입력 목록의 연결을 포함하는 새 목록을 반환합니다.

반면에 += 연산자는 변형 자입니다. 당신이 그렇다면 :

l1 += [30] 

당신은 l1l2 모두 업데이트 된 목록을 참조 것을 볼 수 있습니다.

이것은 파이썬에서 x = x + yx += y 사이의 미묘한 차이 중 하나입니다.

+0

파이썬 튜플에 관한 비슷한 질문이 있습니다. "튜플은 일단 생성되면 어떤 방식 으로든 변경할 수 없습니다."라고 말합니다.그러나 t1 = (4,5,8,2,3) t1 = t1 + (7,1) print (t1) 다음과 같이하면 튜플이 (4, 5, 8, 2, 3, 7) , 1). 그게 왜? 튜플에 의해서 실제로 의미되는 것은 불변이다. – amandi

1

예. l1+[30]은 두 목록을 연결 한 새 목록을 만듭니다. 이것이 목록에있는 +의 작동 방식입니다.

1

예, 변경 가능합니다.

두 번째 예제에서는 참조하는 개체를 수정하는 대신 l1 값을 새 목록으로 덮어 씁니다. 파이썬에서

l1 += [30] 
3

목록을 변경할 수 있습니다

당신이 += 연산자를 사용할 수 있습니다, 원래의 목록을 수정합니다. 참조가 변경된 이유는 + 연산자가 피연산자 값으로 새 목록을 작성하기 때문입니다.

>>> l1 = [1,2,3] 
>>> l2 = l1 
>>> l1 += [30] 
>>> l2 
[1,2,3,30] 
1

리스트는 파이썬에서 변경할 수 있지만,이 개 목록을 추가하는 새로운 객체를 생성합니다 : 한편, += 운영자는 제자리를 추가한다. id을 확인하여 두 객체가 같은지 확인할 수 있습니다. 예를 들어 :

In [1]: list1 = [1, 2] 
In [2]: list2 = [3] 

In [3]: id(list1) 
Out[3]: 4359455952 

In [4]: id(list2) 
Out[4]: 4358798728 

# Creates a new list 
In [5]: list1 = list1 + [42] 

In [6]: list1 
Out[6]: [1, 2, 42] 

# The id of the list1 is different 
In [7]: id(list1) 
Out[7]: 4359456024 

# Mutate the list1 by appending an integer 
In [8]: list1.append(53) 

# The object is the same. 
In [9]: id(list1) 
Out[9]: 4359456024 

감사합니다,

1

당신이 개체에 대한 참조를 선언하는 L2 (목록)를 선언하고 L1을 재 선언 할 때 새 목록을 작성하고 어떤 L1 참조를 변경하는 경우. 그래서 결국 L2는 L1으로 시작한 것을 참조하고 L1은 이제 새로운 객체를 참조합니다.

관련 문제