2011-08-11 5 views
8

코딩 테스트를 위해이 질문을 받았지만 대답을 알지 못했습니다. 누구든지 아이디어가 있습니까?[:] = b와 a = b [:]의 차이점은 무엇입니까? (Python)

+0

가능한 [파이썬에서 목록과 목록 \ [: \]의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/4081561/what-is-the-difference-between-list-and) -list-in-python) –

+1

@Ignacio : 아니요, 이것은 중복이 아닙니다. 그 질문은'a [:] = b' 구조에 대한 언급을하지 않습니다. –

+0

@ Adam : "할당 할 때 ..."시작하는 부분조차도 아닌가? –

답변

8

[:]은 슬라이스 연산자입니다.

왼쪽에 있으면 새 참조를 만들지 않고 목록의 내용을 덮어 씁니다.

오른쪽에 있으면 동일한 내용의 목록 사본이 생성됩니다.

+0

오호 오케이 지금은 이해가됩니다. 명확히하기 위해, id (a)는 [:] = b 일 때 바뀌지 않습니다. id (a)는 a = b [:]를 수행 할 때 변경됩니다. 사람이 다른 사람보다 낫을 수있는 이유가 있습니까? – user701632

+0

예, 정확히 알고 있습니다. 'c'도'a'와 같은리스트를 참조한다면, 두 변수가 업데이트 된리스트를 참조하도록 내용을 변경하고자 할 수 있습니다. – recursive

1

두 경우 모두 a이 목록 b의 사본이됩니다. 그러나이를 달성하는 데 사용 된 방법이 변경되었습니다.

a[:] = b

a

의 차이는 우리가 수정 한 여부 목록을

a = b[:]b의 카피 인, 새로운 목록을 생성 b과 같은 요소를 가지고 있으며, 대체 있도록 목록 a을 수정 기존 목록 또는 새 목록을 만들었습니다.

a = range(3) 
b = range(4) 
c = a # c and a now share the same list 
a[:] = b 
print "a", a 
print "b", b 
print "C", c 

세 가지 목록이 동일한 출력 할 것이다 :

차이를 참조하십시오. a이 이렇게 수정 된 그래서 C와 공유 같은 객체는 c

a = range(3) 
b = range(4) 
c = a # c and a now share the same list 
a = b[:] 
print "a", a 
print "b", b 
print "C", c 

지금 C가 같은에서 인쇄되지 않습니다이었다. 할당 후 ac은 같은 개체를 공유하지 않았습니다.

Speedwise, a[:] = b' is probably a little faster then a = b [:]`. 첫 번째 양식은 새 목록 개체를 만들 필요가 없으며 기존 목록을 수정하기 만하면됩니다. 이것의 중요한 부분은 새로운 메모리를 할당하는 대신 목록에 이미 소유 된 메모리를 재사용 할 수 있다는 것입니다.

2

a = b[:]b__getslice__ 또는 __getitem__을 호출하고 결과를 a에 할당합니다. 거의 모든 경우 (예 : 목록, 튜플 및 기타 시퀀스 유형)이 경우 시퀀스의 얕은 사본이됩니다. 그 동작을 구현하지 않는 클래스에 대해서는 잘 모르겠지만 뭔가 다른 것을 한 사용자 정의 유형을 가질 수 있습니다. 이전에 a의 이전 값을 참조한 다른 모든 오브젝트는 계속 이전 값을 참조합니다.

a[:] = b 반면에, 서열의 것과 ba의 요소의 일부를 대체하거나 __setslice____setitem__ 부른다. 이 경우 a의 시퀀스 유형이 정상적으로 작동하면 끝 점이없는 : 범위는 전체 시퀀스를 나타내므로 a 전체를 바꿉니다. 차이점은 튜플과 같은 불변 유형은 __setslice__을 수행 할 수 없다는 것입니다 (예 : TypeError 예외 발생). 이전에 a을 참조한 다른 모든 개체는 기본 개체가 수정되기 때문에 업데이트됩니다., a = b[:]의 결과 b의 얕은 복사되도록 a에서 a[:] = b 동일 이도록 list로 변경할 유형의

; tuple과 같은 변경 불가능한 유형의 경우 a[:] = b은 유효하지 않습니다. 잘못 행동 한 사용자 정의 유형의 경우 모든 베팅이 해제됩니다. a과 동일한 객체를 참조하는 다른 객체에는 어떤 차이가 발생합니까? a = b[:]과 함께 원래 값 (a)을 참조하지만 a[:] = b은 변경된 객체 (얕은 사본 b)를 나타냅니다.

관련 문제