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