정답
자동차를 생각해보십시오. 우리는 자동차가 어떻게 작동하는지 이해하지 않고도 자동차를 운전할 수 있습니다. 대부분의 사람들은 후드 아래에있는 자동차의 엔진을 보지 않습니다 (미국에서는 hood 라고 부르지 만, 예를 들어 영국 사람들은 보닛 ).
엔진 외에도 전송
Blog
자동차를 생각해보십시오. 우리는 자동차가 어떻게 작동하는지 이해하지 않고도 자동차를 운전할 수 있습니다. 대부분의 사람들은 후드 아래에있는 자동차의 엔진을 보지 않습니다 (미국에서는 hood 라고 부르지 만, 예를 들어 영국 사람들은 보닛 ).
엔진 외에도 전송
이 있습니다. span>은 엔진에서 생성 된 전력을 전달 하여 구동계 로, 궁극적으로 그 힘을 사용하고 바퀴를 돌립니다. 대부분의 사람들은 이러한 세부 사항을 이해하지 못하며 자동차를 작동하기 위해 필요하지도 않습니다.
프로그래머로서 내부에서 무슨 일이 일어나고 있는지 아는 것은 통찰력을 제공하기 때문에 종종 도움이됩니다.
도움이 될 수있는 두 가지 Python 예제 :
Python의 변수 가 자주 설명됩니다. 초보 프로그래머에게는 데이터를 배치 할 수있는 이름이 지정된 상자 가됩니다. 따라서
x = 1
실제로 상자를 만들고 이름을 x
, 상자에 1을 넣습니다. 나중에 상자를 살펴보면 상자에 1이 있음을 알 수 있습니다.
그러나 실제로는 내부
에서 일어나는 일이 아닙니다. 스팬>. 변수 x는 참조 또는 1이 실제로 메모리에 저장되는 위치를 알려주는 레이블입니다. 1이 들어있는 상자에 붙어있는 x가있는 스티커 메모를 생각해보십시오. 상자에 다른 것을 넣기로 결정하면 아마도 2가 될 것입니다. Python은 새로운 상자를 만들고 스티커를 이동합니다. 첫 번째 상자에서 두 번째 상자로 메모하십시오. 이것은 Python의 id()
함수를 사용하여 쉽게 시연 할 수 있습니다.이 함수는 Python의 메모리에서 객체가 어디에 있는지 효과적으로 알려줍니다 (엄격하게 사실은 아니지만 더 이상 도움이되지 않는 다이 그 레션이 필요합니다. 질문에 대한 답변).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
x
이 (가) 특정 장소에 언제 있었는지 알 수 있습니다. 내용을 변경했는데 x
가 실제로 움직였습니다. 이것이 일어나는 이유는 여기서도 중요하지 않은 또 다른 여담입니다. 사실 x는 x가 참조하는 데이터가 이제 다른 위치에 있다는 의미에서 움직였습니다.
초보 Python 프로그래머는 이것을 알지 못하며 더 중요한 것은 이 사실을 알 필요가 없습니다 . 이름이 지정된 상자의 비유를 사용하는 것은 완벽합니다.
두 번째 예는 더 복잡하며 초보자가 이해하기 어려울 수 있습니다.
Python 데이터 모델 은 소위 내장 함수를 내부 클래스 메서드에 매핑합니다. 저는 TV 쇼 Stranger Things를 기준으로 설명하고 싶습니다. 그 쇼에는 위쪽 아래 가 있습니다. 사물은 알아볼 수 있지만 엉망입니다. Python len()
함수를 고려하세요. 이것은 매뉴얼에 내장 함수 로 나열되어있어 무언가의 요소 수를 반환합니다. string
( 컨테이너 ), (컨테이너이기도 함) 등입니다.
Python 초보 프로그래머는 일반적으로 len()
가 단순히 내장 함수이며 모든 컨테이너. 실제로 내부 에서 일어나는 일은 Python이 len()
에 대한 호출을 거꾸로 \_\_len\_\_()
라고합니다. len()
에 전달한 개체에 \_\_len\_\_()
메서드가 있으면 작동합니다. 그렇지 않다면 그렇지 않습니다. 예를 들어 정수로 len()
를 호출 할 수없는 이유입니다.
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
초보 파이썬 프로그래머는 이것을 정수가 컨테이너가 아니라는 것을 의미한다는 것을 이해합니다.그러나 len()
함수를 호출 할 수있는 정수 유형을 만드는 것은 쉽습니다.
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
MyInt
라는 새 유형을 만들고 변수
는 MyInt
유형이며 len()
를 호출 할 수 있습니다. 내 len()
는 꽤 쓸모가 없지만 () 단지 “컨테이너”가 아닌 모든 객체에 대해 len()
를 호출 할 수 있다는 점을 증명합니다. ” 실제로 프로그래머로서 비즈니스 또는 기타 조직을 나타내는 고유 한 개체 Organization
를 만들 수 있습니다. Organization
개체에 대해 len()
를 호출하고 조직이 존재 한 연수를 반환하도록 할 수 있습니다. .
그래서 내부에서 일어나는 일을 이해함으로써 우리는 프로그래머로서 더 나아갈 수 있습니다.
다른 사람들이“ Under the hood 는 일반적으로 의미합니다.
명확하게해야 할 몇 가지 참고 사항 : 가장 단순한 형태의 컴퓨터는 프로세서와 주 메모리입니다. 프로세서는 매우 특정한 명령을 읽고 메모리의 값을 이동합니다. 메모리는 수많은 셀로 분할되고 각 셀에는 주소가 있습니다.
“내부”컴퓨터의 메모리는 다음과 같습니다.
(출처 : https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
고급 언어로 작업 할 때 (Java 또는 Python 또는 비슷한 것) 사물이 왜 그런지 이해하기가 어렵습니다. 예를 들어 연결 목록을 고려해 보겠습니다. 옆에 다른 풍선을 가리키는 화살표와 함께 숫자가있는 풍선 그림이 표시되었을 수 있습니다.
예 :
이 모든 것이 연결 목록이 배열과 비교하여 작동하는 방식을 이해하는 데 유용합니다. 그러나 “내부”는 많이 다릅니다.
우리가 말했듯이 컴퓨터의 모든 것은 값이있는 메모리 셀입니다. 연결된 목록 노드는 이웃 근처에서 시각화되지만 이웃에서 수백 또는 수천 바이트 떨어져있을 수 있습니다. 후드 아래에서 그림에 보이는 화살표는 실제로 포인터이며 포인터는 메모리의 모든 셀을 참조 할 수 있습니다. 특히 포인터는 목록에서 다음 노드의 주소를 참조합니다.
이 예제가 그가 말하는 내용을 명확히하는 데 도움이되기를 바랍니다.