학습 파이썬 참조를 공유

기사 디렉토리

 

공유 참조 무엇입니까

파이썬 대화 형 모드에서 다음 문을 입력 가정하자 :

>>> a = 3
>>> b = a
  • 1

그림 삽입 설명 여기

순 효과는 변수 A 및 B는 (동일한 메모리 공간을 가리키는) 같은 객체를 참조한다는 것이다. 이것은 파이썬에서 공유 참조라고합니다 - 더 변수 이름이 같은 객체를 참조하십시오.

성명은이 있다면

>>> a = 'spam'
  • 1

어떻게됩니까?

변수 생성 된 상수 식 "스팸"에 의해 새로운 오브젝트를 참조하지만,이 할당 연산자 (3)을 변경하는 것을 목적으로 아니기 때문에 변수가 여전히 3 B 원래 객체 참조는 단지 변수 B를 점을 변수를 변경하지 변경합니다.

그림 삽입 설명 여기

파이썬에서, 변수는 메모리 영역 (예 : C 언어에서 변수로) 라벨을 변경할 수 있습니다 대신 항상 개체에 대한 포인터입니다. 원래 객체를 수정하지, 새로운 값에 변수를 할당하지만, 객체가 완전히 다른 참조 할이 변수를 보자.

참고 : 변수 객체와 장면에 그 자리를 변경하는 경우, 위의 상황에서 변화의 어떤 종류가있을 것입니다.

현장에서 참조 및 수정 (공유 참조 및 인 - 장소 변경) 공유

장소에 오브젝트를 변경 않는 객체, 오퍼레이션 몇 가지가 있습니다. 예를 들면, 오프셋 할당하여 목록에 대신 객체의 새로운리스트를 생성하는 오브젝트들의리스트를 변경한다. 하나 개의 변수에 변화가 다른 변수에 영향을 미칠 것이기 때문에 장소에서이 수정의 대상에 대한 지원은 공유 참조는주의해야합니다.

다음 문을 고려 :

>>> L1 = [2, 3, 4]
>>> L2 = L1
  • 1

L1은 2,3,4를 포함하는 객체들의리스트이다. 목록의 요소가 있으므로, 자신의 위치에서 읽을 L1[0]참조 물론 2. 객체 목록 자체는 정수와 문자열로, 객체입니다. 이상의 동작 후, 두 줄, L1 및 L2는 동일한 오브젝트를 참조.

플러스 3 호선 지금 :

>>> L1 = [2, 3, 4]
>>> L2 = L1
>>> L1[0] = 24
  • 1

우리는 L1과 L2의 값을 보면 :

>>> L1
[24, 3 ,4]
>>> L2
[24, 3 ,4]
  • 1
  • 4

여기서, L1은 변경되지 않고, 변경된 요소 L1 참조 된 오브젝트는, 이러한 변형이리스트 객체의 일부를 커버한다. 수정은 L1에 영향을 미치지 않도록 동시에, L1 및 L2 참조 된 개체의 목록, L2는 같은 장소에 영향을 미칠 것 때문입니다. 우리가 L2를 변경할 수 있지만하지 않지만 그 값이 변경됩니다.

당신이 이러한 결과를 원하지 않는 경우, 당신은 참조를 만드는 대신 객체를 복사해야합니다. 목록을 복사하는 방법에는 여러 가지가 있습니다, 가장 쉬운 방법은 처음부터 끝까지 조각이다.

>>> L1 = [2, 3, 4]
>>> L2 = L1[:]
>>> L1[0] = 24
>>> L1
[24, 3, 4]
>>> L2
[2, 3, 4]
  • 1
  • 4
  • 5
  • 6
  • (7)

기준은 L1 참조하는 객체의 복사본이기 때문에 여기에서, 변형 L2 L1, L2에 영향을 미치지 않는다. 다른 메모리 영역에, 즉, L1 및 L2 점.

공유 참조와 동일

>>> x = 42
>>> x = 'shrubbery'    
  • 1

파이썬은 캐싱 및 작은 정수 및이 두 줄을 수행 한 후 작은 문자열의 재사용 때문에 개체 (42)은 복구되지 않을 수 있습니다 오히려, 그것은 여전히 ​​시스템 테이블에 저장 될 수있다, 다음 시간을 기다리는 당신 도 42는 또 다른 코드 재사용을 생성한다. 이 참조되지 않을 때 그럼에도 불구하고, 대부분의 개체 유형은 즉시 회수된다.

두 변수가 동일한 지 여부를 확인하기 위해 파이썬에서 두 가지 방법이 있습니다.

>>> L = [1, 2, 3]
>>> M = L                 # M and L reference the same object
>>> L == M                # Same values
True
>>> L is M                # Same objects
True
  • 1
  • 4
  • 5
  • 6

==개체 참조 두 테스트가 동일한 값이 있는지 여부를 오퍼레이터,이 방법은 종종 파이썬 동등 검사하는 데 사용된다.

is운영자 심사 대상에 대한 운영자에게 신원. 두 변수 이름이 동일한 개체를 가리키는 경우이 평등에 대한 더 엄격한 테스트 그래서, 그것은 True를 반환합니다.

사실, is이 공유 참조를 검출하는 방법이다, 그래서 상대적으로, 포인터 참조. 두 객체의 값이 동일한 경우에도 다른 개체를 참조 변수 이름 경우도 False를 반환합니다.

예를 들면 :

>>> L = [1, 2, 3]
>>> M = [1, 2, 3]         # M and L reference different objects
>>> L == M                # Same values
True
>>> L is M                # Different objects
False
  • 1
  • 4
  • 5
  • 6

유사한 테스트 소수의 경우 :

>>> X = 42
>>> Y = 42                # Should be two different objects
>>> X == Y
True
>>> X is Y                # Same object anyhow: caching at work!
True
  • 1
  • 4
  • 5
  • 6

해야하지만, 우스운, X 및 Y (42)의 참조에 6 행 5 원래 두 물체들 (42), 논리적으로 3 내지 4 라인 말함 두 물체가 동일한 있기 때문에, 이해할 거짓 출력 물고기는, 그러나, 작은 정수와 문자열의 캐시 및 재 사용, 그래서 is우리 X와 Y가 같은 객체를 참조 말한다.

사실, 당신은 사용할 수있는 sys모듈 getrefcount기능 쿼리 개체 인용. 예를 들어, 우리는 정수 인용 횟수를 확인 :

>>> import sys
>>> sys.getrefcount(1)   
812
  • 1

이 오브젝트 캐싱 메커니즘과 코드 재사용은 관련이 없습니다. 파이썬이 실행 속도를 증가하기위한 것입니다.

게시 24 개 원래 기사 · 원 찬양 30 ·은 50000 +를 볼

추천

출처blog.csdn.net/yufen9987/article/details/103036520