2012-03-09 3 views
16

내가 할 가능성이 있다는 것을 알고 있지만 :파이썬은 문자열에서 마지막 문자를 제거하고 반환 그것을

>>> a.pop() 
c 

은 다음과 같습니다

>>> a = "abc" 
>>> result = a[-1] 
>>> a = a[:-1] 

지금 나는 또한 문자열은 불변이 같은 때문에 뭔가 있다는 것을 알고 불가능합니다.

하지만 실제로이 방법이 바람직합니까?

+0

를 추가하려고했는데 왜 작동하지 않는지 모르겠다. –

+2

정말 당신의 노력과 코드를 최적화하는 것이 얼마나 중요한지에 달려 있습니다. 나는 대부분의 경우에 단지 새로운 타입을 생성하거나리스트를 사용하는 대신 새로운 문자열을 반환하는 것이 더 바람직하다고 생각할 것이다. – dave

+0

자주해야하는 경우 알고리즘을 다시 생각해보십시오. – delnan

답변

27

문자열은 좋은 이유 때문에 "불변"입니다. 실제로 생각보다 많은 두통을 덜어줍니다. 또한 Python은 사용 최적화에 매우 영리합니다. 당신이 단위에 문자열을 처리하려는 경우, 당신은 split()로의 일부를 잡아 당기거나 인덱스를 사용하여 두 부분으로 분리 할 수 ​​있습니다 :

a = "abc" 
a, result = a[:-1], a[-1] 

이것은 당신이 당신의 문자열을 분할하고 있음을 보여준다.당신이 문자열의 모든 바이트를 검사 할 수 있습니다 경우 (원하는 경우, 역), 당신은 그것을 반복 할 수 있습니다

for result in reversed(a): 
    ... 

나는이 조금 인위적인 것 같다 추가해야합니다 : 귀하의 문자열 일부를 가질 가능성이 높습니다 구분, 그리고 당신은 split를 사용합니다 :

ans = "foo,blah,etc." 
for a in ans.split(","): 
    ... 
5

유일한 선호 방법 일뿐만 아니라 유일한 방법입니다. 문자열은 불변이므로 문자열에서 문자를 "제거"하려면 다른 문자열 값을 원할 때마다 새 문자열을 만들어야합니다.

문자를 변경할 때마다 완전히 새로운 문자열을 만들어야한다는 이유에서 문자열이 변경되지 않는 이유가 궁금 할 수 있습니다. 결국 C 문자열은 문자 배열이므로 변경할 수 있으며 C보다 더 명확하게 문자열을 지원하는 일부 언어에서도 문자열을 변경할 수 있습니다. 불변의 문자열은 보안/안전성과 성능면에서 두 가지 이유가 있습니다.

보안은 문자열이 변경되지 않는 가장 중요한 이유 일 수 있습니다. 문자열을 변경할 수없는 경우 일부 라이브러리에 문자열을 전달할 수 없으며 예상치 못한 상황에서 문자열을 변경할 수 없습니다. 문자열 매개 변수를 변경하는 라이브러리가 궁금 할 수 있지만 클라이언트에 코드를 제공하면 표준 라이브러리의 버전을 제어 할 수 없으며 악의적 인 클라이언트는 표준 라이브러리를 변경하여 프로그램을 중단하고 더 많은 것을 찾을 수 있습니다 내부에 대해. 변경 불가능한 객체는 추론하기가 쉽기 때문에 시스템이 특정 위협에 대해 안전하다는 것을 증명하려고 할 때 매우 중요합니다. 이 추론의 용이성은 변경 불가능한 객체가 자동으로 스레드로부터 안전하기 때문에 스레드 안전성에 특히 중요합니다.

성능은 놀라 울 정도로 자주 변경되지 않는 문자열의 경우 더 좋습니다. 문자열 조각을 가져올 때마다 파이썬 런타임은 원래 문자열 위에보기 만 배치하므로 새로운 문자열 할당이 없습니다. 문자열은 변경 불가능하기 때문에 실제로 복사하지 않고 복사 의미를 얻습니다. 이는 실제 성능에서 승리합니다.

에릭 리 퍼트 (Eric Lippert)는 문자열 불변의 이유 (파이썬이 아니라 C#) here에 대한 자세한 설명을 제공합니다.

1

예, 파이썬 문자열은 변경 불가능하며 수정하면 새로운 문자열이 만들어집니다. 이것이 대부분 어떻게 이루어 졌는지입니다.

그래서 진행하십시오.

3

질문의 정확한 표현은 내가 불가능하다고 생각합니다.

return 내게는 문자열을 매개 변수로 전달한 함수가 있다는 의미입니다.

이 매개 변수는 변경할 수 없습니다. 이 함수를 지정하면 전달 된 문자열이 아닌 함수 내의 매개 변수 값만 변경됩니다. 예 :

>>> def removeAndReturnLastCharacter(a): 
     c = a[-1] 
     a = a[:-1] 
     return c 

>>> b = "Hello, Gaukler!" 
>>> removeAndReturnLastCharacter(b) 
! 

>>> b # b has not been changed 
Hello, Gaukler! 
관련 문제