2015-01-04 2 views
1

. 예를 보여줍니다 print A를 실행 한 후공유 참조 및 평등

A = ['spam'] 
B = A 
B[0] = 'shrubbery' 

결과 :

'shrubbery' 

지금 내 생각 과정은 A가 정의되어 있지만 변경 적이 있다는 것입니다.

'string' 

사람이 설명 할 수 :

이 예는이 print A를 실행 한 후 결과가

A = 'string' 
B = A 
B = 'dog' 

다른 결과를 얻을 수?

+0

이 모든 것을 뒷받침하는 파이썬 내부 메모리 모델에 대한 자세한 내용은 Wesley Chun의 [Understanding Python 's 메모리 모델 및 변경 가능성] (http://cdn.oreillystatic.com/en/assets/1 /event/95/Python%20103_%20Memory%20Model%20_%20Best%20Practices%20Presentation.pdf) 그가 [고전적인 질문에 대한 답변]에서 언급 한 (http://stackoverflow.com/a/2573965/3155195). 특히 9 페이지는이 문제에 관한 내용입니다. – zehnpaard

+0

더 많은 오디오 프리젠 테이션을 원하시면 [같은 프리젠 테이션의 비디오] (https://ep2013.europython.eu/conference/talks/python-103-mmmm-understanding-pythons-memory-model-mutability-and-methods) 링크를 클릭하십시오. 시각적으로 기울어졌다. – zehnpaard

답변

3

첫 번째 예에서 은 으로 참조되는 목록을으로 수정합니다.

수행 :

B[0] = 'shrubbery' 

파이썬이 'shrubbery'의 값 B에 의해 참조 목록의 첫 번째 항목을 설정합니다 알려줍니다. 또한이 목록은 A이 참조하는 동일한 목록입니다. 일을하기 때문이다는 :

B = A 

B 및 각 A 원인이 동일한 목록을 참조하십시오

>>> A = ['spam'] 
>>> B = A 
>>> A is B 
True 
>>> 

그래서, B에 의해 참조 목록에 대한 변경도 A에 의해 참조 목록을 (영향을 미칠 것 그 반대의 경우도 마찬가지 임).


그러나 두 번째 예제는 아무 것도 수정하지 않습니다. 대신, 단순히 는 새 값으로 이름 B을 할당합니다.

이 라인은 실행되지되면 :

B = 'dog' 

B는 더 이상 문자열 'string'를 참조하는 것이 아니라 새 문자열 'dog'. 한편 A의 값은 변경되지 않습니다.

0

enter image description here

내가 둘 다 같은 list을 의미한다, 당신은 첫 번째 방법에서 보듯이

:-)이 방법으로 이해할 수 희망, 두 번째 방법에서 두 번째 different.So하지 변경 다른 효과.다음 단계 분석에 의한 단계의

enter image description here

enter image description here

:

+2

@NoMorePuppies 좋은 설명이라고 생각하지만 순수한 그래픽 답변은 SO에서 받아 들일 수 없다고 생각합니다. 검색 가능하고 반복 가능하지 않으며 접근성 표준을 준수하지 않습니다. – Jivan

-2

여기 둘 사이의 차이입니다

A = ['spam'] 
"A points to a list whose first element, or A[0], is 'spam'." 
B = A 
"B points to what A points to, which is the same list." 
B[0] = 'shrubbery' 
"When we set B[0] to 'shrubbery', the result can be observed in the diagram. 
A[0] is set to 'shrubbery' as well." 
print (A): 



A = 'string' 
"A points to 'string'." 
B = A 
"B points to what A points to, which is 'string'." 
B = 'dog' 
"Oh look! B points to another string, 'dog', now. 
So does what A points to change? No." 
The result can be observed in the diagram. 
print (A): 
+0

Python에는 "기본 유형"이 없습니다. 모든 값은 객체입니다. 이것은 순수하게 이름 바인딩의 문제입니다. – kindall

+0

@kindall 제 답변이 지금 정확한지보십시오. 그 점을 지적 해 주셔서 감사합니다! 나는 자바를 계속 생각했다 ... – Jobs

+0

두 번째 경우에서 A와 B는 여전히 문자열 객체에 대한 포인터이다. 그들 자신은 가치가 없습니다. 파이썬의 모든 변수는 객체에 대한 참조를 저장합니다. – kindall

0

가장 현대적인 동적 언어의 경우와 마찬가지로, 파이썬의 변수는 실제로 C 포인터와 같은 종류의 참조입니다. 즉, A = B (A와 B는 둘 다 변수 임)을 수행하면 A가 B와 동일한 위치를 가리키게됩니다.

첫 번째 예에서는 기존 객체를 변형 그 자리에 - 이것은 variable_name[index/key] = value 구문이하는 것입니다. A와 B 모두 똑같은 것을 계속 지적하지만,이 첫 번째 항목은 이제 '스팸'대신 '관목적'입니다.

두 번째 예에서는 B = 'dog'이라고 말하면 다른 (이 시점에서 새로운) 객체를 가리키게됩니다.