첫 번째 코드:
으아악첫 번째 코드 실행 결과:
두 번째 코드:
으아악두 번째 코드 실행 결과:
파이썬을 배우면서 문자열은 불변형, 리스트는 가변형이라는 말을 들었습니다. 즉, 문자열을 변경하려면 실제로 새 문자열을 만들어 메모리의 새 주소에 넣습니다. 원래 문자열은 여전히 동일합니다. 첫 번째 코드 부분에 표시된 대로입니다.
목록은 다릅니다. 목록은 원래 메모리 주소에서 직접 수정할 수 있습니다. 두 번째 코드 조각에 표시된 대로입니다.
내 질문:
변경 가능한 유형과 불변 유형의 근본적인 차이점은 무엇인가요? 왜 이런 차이가 발생하는가? 왜 첫 번째 코드에서는 a가 변경하려면 주소를 변경해야 하는데, 두 번째 코드에서는 b가 주소 변경 없이 목록의 값을 직접 수정할 수 있나요? 여기에 기본 논리는 무엇입니까? 목록 자체가 실제로는 값의 모음이라는 뜻인지 궁금합니다. 단지 모음 자체를 반영하고 값 모음을 이 한 곳으로 지정하므로 수정이 가능하다는 뜻인가요? 명확하게 표현했는지 모르겠습니다.
이게 궁금합니다. 즉, 목록이 정확히 무엇인지 직접 변경할 수 있는 이유는 무엇인가요? 문자열은 변경할 수 없습니다. 밑바닥까지 더 깊이 들어가보니 그 둘은 무엇일까요?
사실 객체는 변경 가능하기도 하고 불변이기도 합니다. 그렇습니다
으아아아py
, 都是内部实现的问题, 如果我修改相应的方法, 将其写回到本身, 这样也能模仿出可变的现象, 就小小类似tuple
和list
的关系,既然想了解底层, 那就直接看源码吧:
这是字符串的
upper()
목록입니다
으아아아append
Python 문자열은 캐시됩니다. 두 개의 동일한 문자열이 서로 다른 변수 a와 b에 있으면 해당 id(a)와 id(b)는 동일합니다.
그러나 a와 b의 참조가 0이면 객체가 자동으로 소멸됩니다.
원본 포스터의 예:
a = a.upper()
a의 변수 내용이 변경되어 다릅니다. 이전 내용에는 참조가 없으며 개체는 가비지 수집으로 인해 삭제됩니다.
b는 리스트이고, 가변적이며, 메모리를 다시 신청할 수 있습니다. 동시에 b에는 콘텐츠 참조가 있으므로 삭제되지 않습니다.
더 깊이 들어가서 Python의 C 소스 코드를 살펴보세요~
파이썬 언어에 규정된 불변일 수 있습니다.
Immutable 유형은 객체 자체를 수정하는 메서드를 제공하지 않지만, mutable 유형은 이러한 메서드를 제공합니다. 이러한 차이점에는 신비한 것이 없습니다.
하드웨어 관점에서 사용자에게 제공되는 인터페이스는 규정에 따라 설정되며, 메모리는 고정된 방식으로 작동됩니다.
위로 올라가는 것은 사용자 작업을 풍부하게 하기 위해 다수의 하드웨어 API를 캡슐화하는 운영 체제 계층입니다. Python 인터프리터는 C 언어로 작성되며 Python 화용론만 사용하여 코드를 작성합니다. 위의 전제 하에서 현재 문제를 설명하기 위해 Python의 작성자는 Python의 가변성과 불변성을 규정합니다. 이러한 규정을 구현하는 방법은 다른 기본 API를 호출하는 것일 수 있습니다. 서로 결합하여 구현됩니다. 이러한 조항은 Python 화용론의 형태로 사용자에게 제공되며 최종적으로 컴퓨터 실행을 위해 0,1로 컴파일됩니다. 사용자의 경우 가변 객체와 불변 객체는 언어가 제공하는 기능으로 일부 기능을 완료할 수 있지만 실제로 컴퓨터에서는 차이가 없습니다.