개발/Python

파이썬 문자열이 변경 불가능한 이유는 무엇입니까?

MinorMan 2021. 4. 21. 06:10
반응형

<질문>

  1. 파이썬 문자열을 불변으로 만드는 디자인 이유는 무엇입니까? 프로그래밍을 더 쉽게 만드는 방법은 무엇입니까?
  2. 나는 C에있는 것과 같은 변경 가능한 문자열에 익숙합니다. 변경 가능한 문자열없이 프로그래밍하려면 어떻게해야합니까? 모범 사례가 있습니까?

<답변1>

문자열을 받으면 그대로 유지됩니다. 당신이Foo아래와 같이 문자열 인수를 사용하여 문자열을 수정합니다. 다음Foo의 이름이 갑자기 변경됩니다.

class Foo(object):
    def __init__(self, name):
        self.name = name

name = "Hello"
foo = Foo(name)
name[0] = "J"

변경 가능한 문자열을 사용하면 나쁜 일이 발생하지 않도록 항상 복사본을 만들어야합니다.

또한 단일 문자가 길이가 1 인 문자열과 다르지 않은 편리함을 제공하므로 모든 문자열 연산자가 문자에도 적용됩니다.

마지막으로 문자열이 변경 불가능하지 않은 경우 문자열을 키로 안정적으로 사용할 수 없습니다.dict, 해시 값이 갑자기 변경 될 수 있기 때문입니다.

변경 불가능한 문자열로 프로그래밍하는 경우 숫자를 처리하는 것과 동일한 방식으로 처리하는 데 익숙해집니다.가치, 객체가 아닙니다. 첫 글자 변경name될 것이다

name = "J" + name[1:]

<답변2>

불변 문자열은 C 문자열과 비교할 때 메모리 할당을 크게 단순화합니다. 길이를 추측하지 않고 과도하게 할당되기를 바라며 과도하게 할당합니다.

더 안전합니다.C에서 할 수있는 방식으로 버퍼 오버런이 발생합니다.

변경 가능한 문자열 사용 사례는 하나뿐입니다.

  • 부분 문자열 또는 단일 문자 교체

모두다른 문자열 사용 사례 (연결, 검색 등)는 변경이 중요하지 않습니다. 다른 모든 경우에는 변경 가능성이 중요하지 않습니다.

Python에서 문자 또는 하위 문자열을 바꾸려면 새 문자열을 만들기 만하면됩니다.

x = x[:place] + replacement + x[place+1:]

그것은 참신하거나 독특한 유일한 코드입니다.

이해하지 못하는 이유로 다음을 추가하는 것이 중요해 보입니다.

"불변 문자열보다 문자열 버퍼 오버플로를 방지하는 다른 방법이 있습니다."

이 질문의 목적을 위해 (특히 Python에 대한) 불변 문자열은 버퍼 오버플로가 없다는 즐거운 결과를 가져옵니다. 다른 언어의 경우 다른 원칙, 규칙 및 뉘앙스가 적용됩니다.


<답변3>

  1. 변경 불가능한 객체는 자동으로 스레드로부터 안전합니다.
  2. C의 문자열과 관련된 극심한 고통에 비해 Python 문자열을 사용하는 것이 사소한 일임을 알 수 있습니다.

<답변4>

변경 불가능한 문자열은 문자열을 복사 할 필요없이 사전 및 유사한 데이터 구조의 키가 될 수 있습니다. 다른 방법보다 변경 불가능한 문자열 주위에 변경 가능한 래퍼를 만드는 것이 더 쉽습니다.


<답변5>

대부분의 언어에는 변경 불가능한 문자열이 있습니다. 여기에는 Java, Python 및 C #이 포함됩니다. 일반적으로 문자열을 연결할 때 언어는 완전히 새로운 문자열을 할당하고 두 문자열의 내용을 새 문자열로 복사합니다.

불변성은 프로그래밍을 더 쉽게 만드는 경향이 있습니다. 특히 다중 스레드 환경을 다룰 때.


<답변6>

변경 불가능한 문자열은 프로그래밍을 훨씬 쉽게하므로 C #과 Java도이를 사용합니다.

문자열을 변경할 수 있었다면 악의적 인 호출자가 문자열을 변경할 수 있으므로 외부에서 제공 한 문자열을 신뢰할 수 없습니다.
또한 멀티 스레딩을 훨씬 더 어렵게 만듭니다.

반응형