2013-01-21 5 views
25

난 그냥 파이썬을 배우고 내가 파이썬은 왜 사용한다 [:] 이상 =

s는 문자열 조각에서 https://developers.google.com/edu/python/strings

에 튜토리얼하지만 섹션

을 갈거야 [:]입니다 ' '안녕하세요 - 항상 생략 둘 것은 우리에게 전체 일의 사본을 아웃

(이 문자열이나 목록과 같은 순서를 복사하는 파이썬 방법) 제공 호기심 때문에 왜 = 연산자를 사용하지 않습니까?

s = 'hello'; 
bar = s[:] 
foo = s 

는 지금까지 내가 말할 수있는 모두 barfoo는 같은 값을 가지고있다.

+6

나는이 문장에 동의하지 않을 것이다. 이것은 문자열을 복사하는 파이썬 방법이 아니다. 당신은'='을 사용하는 것이 맞습니다. 목록은 다른 이야기입니다. – wim

답변

40

=을 참조하십시오. [:]을 사용하면 복사본을 만들 수 있습니다. 불변 인 문자열의 경우 이것은 중요하지 않지만 목록 등의 경우에는 중요합니다.

>>> s = 'hello' 
>>> t1 = s 
>>> t2 = s[:] 
>>> print s, t1, t2 
hello hello hello 
>>> s = 'good bye' 
>>> print s, t1, t2 
good bye hello hello 

하지만 : 문자열을 처리 할 때

>>> li1 = [1,2] 
>>> li = [1,2] 
>>> li1 = li 
>>> li2 = li[:] 
>>> print li, li1, li2 
[1, 2] [1, 2] [1, 2] 
>>> li[0] = 0 
>>> print li, li1, li2 
[0, 2] [0, 2] [1, 2] 

은 왜 그것을 사용? 내장 문자열은 변경할 수 없지만 문자열을 요구하는 라이브러리 함수를 작성할 때마다 사용자는 "문자열처럼 보이고"문자열처럼 작동하지만 사용자 정의 유형 인 것을 제공 할 수 있습니다. 이 유형은 변경 될 수 있으므로이를 처리하는 것이 좋습니다.

class MutableString(object): 
    def __init__(self, s): 
     self._characters = [c for c in s] 

    def __str__(self): 
     return "".join(self._characters) 

    def __repr__(self): 
     return "MutableString(\"%s\")" % str(self) 

    def __getattr__(self, name): 
     return str(self).__getattribute__(name) 

    def __len__(self): 
     return len(self._characters) 

    def __getitem__(self, index): 
     return self._characters[index] 

    def __setitem__(self, index, value): 
     self._characters[index] = value 

    def __getslice__(self, start, end=-1, stride=1): 
     return str(self)[start:end:stride] 


if __name__ == "__main__": 
    m = MutableString("Hello") 
    print m 
    print len(m) 
    print m.find("o") 
    print m.find("x") 
    print m.replace("e", "a") #translate to german ;-) 
    print m 
    print m[3] 
    m[1] = "a" 
    print m 
    print m[:] 

    copy1 = m 
    copy2 = m[:] 
    print m, copy1, copy2 
    m[1] = "X" 
    print m, copy1, copy2 

면책 조항 :

이러한 유형은 다음과 같을 수 있습니다이 작동 할 수 및 [:]의 사용 동기를 부여하는 방법을 보여 그냥 샘플입니다. 테스트되지 않았고, 불완전하며, 끔찍한 성능을 보입니다.

+2

+1'#translate to german ;-)' – root

+2

벌써 주위에 거짓말하는 그런 수업이 있었음을 말해 주시고, 다음과 같은 대답을 위해 그 모든 것을 정리하지 않으셨습니까? :) –

+0

미안하지만, 저는해야합니다. 당신을 실망시킵니다 ;-) 제 응답의 커밋 히스토리를 보면, 그것이 커짐을 알 수 있습니다. –

1

그들은 같은 값을 가지고 있지만, 변경 가능한 객체를 다룰 때 근본적인 차이가 있습니다. bar = foobaz = foo[:]을 할당합니다. 이제 bar - bar.append(4)을 변경한다고 가정 해 보겠습니다. 당신은

print foo 
# [1, 2, 3, 4] 

지금 4 추가에서 온 않았다 어디 ... foo의 값을 확인하고? bar을 할당했기 때문에foo이므로 하나를 변경하면 다른 하나를 변경합니다. baz - baz.append(5)을 변경했지만 나머지 두 개에는 아무 것도 발생하지 않았습니다. 사본foo에서 baz으로 지정했기 때문입니다.

그러나 문자열이 변경되지 않기 때문에 중요하지 않습니다.만약리스트가있는 경우

0

이 결과는 다르다 :

l = [1,2,3] 
l1 = l 
l2 = l[:] 

L2가 L1 [0] = (7) 또한 수정된다는 것을 의미 L1은 L의 별칭 동안 L (다른 객체)의 사본 l, l2 [1] = 7은 l을 수정하지 않습니다.

0

개체를 참조하고 개체 복사본을 참조하는 것이 문자열 같은 변경 불가능한 개체에 대해 다르지 않지만 변경 가능한 개체 및 변경 가능한 메서드 (예 : list)에 대해 수행합니다. 변경 가능한 객체에 대한

같은 일이 : 위의 예 pythontutor에

a = [1,2,3,4] 
b = a 
c = a[:] 
a[0] = -1 
print a # will print [1,2,3,4] 
print b # will print [-1,2,3,4] 
print c # will print [1,2,3,4] 

시각화 - http://goo.gl/Aswnl.

관련 문제