객체 참조, 가변성 및 재활용

1. 함수 매개 변수 참조로

단지 파이썬 전달 매개 변수의 모드는 공유에 의한 호출 (共享传参) . 함수의 각 형식 매개 변수는 인수의 각 기준의 사본을 얻을 수 있다는 의미를 공유하여 호출합니다. 즉, 함수 내에서 매개 변수가 될 별칭 실제 인수. 

이 계획의 결과는 함수가 매개 변수로 전달하는 가변 객체를 변경할 수 있지만, 그 개체의 ID를 변경할 수 없다는 것입니다. 

예 8-11. 함수는 수신하는 가변 객체를 변경할 수있다.

"" " 함수가 수신하는 가변 객체 변경할 수 " ""

 
>>>을 DEF (a, b) F : 
... + = B 
...      리턴 
... >>> X = 1 
>>> Y = 2 
>>> F (x, y)를
 3 
>>> X, Y         # 횟수 X는 변하지 않는다. 
(1, 2 )
 >>> 
>>> A = [1, 2 ]
 >>> B = [3,4 ]
 >>> F (a, b) 
[ 1, 2, 3, 4 ]
 >>> 먼트의         # 리스트 (A)은 변경된다. 
([1, 2, 3,
)
 >>> U = (30, 40 )
 >>> F (t, U) 
( 10, 20, 30, 40 )
 >>> t, U         # 튜플 t는 변하지 않는다. 
((10, 20), (30, 40 ))
 >>>

파이썬 함수 매개 변수 전달 참조 : https://www.cnblogs.com/zhoug2020/p/9110663.html

 

매개 변수의 기본값으로 2. 변경 가능한 유형 : 나쁜 아이디어

당신은 매개 변수의 디폴트 값으로 변경 가능한 객체를 피해야한다.

예 8-12. 간단한 클래스는 변경 가능한 기본의 위험을 설명합니다.

클래스 HauntedBus : 

    데프  __init__ (자기, 승객 = []) :   # 승객 인수가 제공되지 않는 경우,이 매개 변수가 초기에 비어있는 기본 목록 객체에 바인딩됩니다. 
        self.passengers는 = 승객     # 이 할당에는 승객 인수가 주어지지 자체 기본 목록의 별칭입니다 승객의 별칭, self.passenger 있습니다. 

    데프 (자기 이름) 선택 : 
        self.passengers.append (이름)     #을 () self.passengers으로 사용되는 방법은 (.remove시) 및으로 .Append, 우리는 실제로의 속성 기본 목록을, 돌연변이된다 기능 오브젝트. 

    데프 (자기 이름) 드롭 :bus3 = HauntedBus () #의 bus3은 다시 기본 목록이 할당, 빈 시작합니다. 



>>> bus3.passengers # 기본값은 빈 더 이상!다시 기본 목록이 할당됩니다. 
[ '캐리'] 
>>> bus3.pick ( '데이브')

>>> bus2.passengers 번호 지금 데이브, bus3 고른, BUS2에 나타납니다. 
[ '캐리', '데이브'] 
>>> 
>>> bus2.passengers는 bus3.passengers # bus2.passengers 및 bus3.passengers가 동일한 목록을 참조한다. 
진정한 
>>> bus1.passengers 번호 그러나 bus1.passengers는 별개의 목록입니다. 
[ '빌', '찰리'] 
"" " 

#이 문제입니다. 그들 사이 같은 승객 목록을 공유까지 초기 승객 목록 끝을하지 않는 버스 인스턴스 


" ""모듈이로드 될 때 보통 - 기본 값은 함수 객체의 속성이됩니다. 경우에 따라서 
이상한 일들이 일어날은 HauntedBus이 비어 시작하는 경우에만 다음 self.passengers 때문에 기본값으로 오전 별칭이된다
승객 파라미터 값. - 문제는 함수가 정의 될 때마다 기본값이 평가된다는 점이다 
즉, 모듈이로드 보통 때 - 기본 값은 함수 객체의 속성이됩니다. 소위 경우 
기본값은 변경 가능한 객체이며, 당신이 그것을 변경, 변화는 함수의 모든 미래의 호출에 영향을 미칠 것입니다. 
"" " 

#은 그 __defaults__ 속성 양심의 가책을 느끼게 학생들을 대상 init__ HauntedBus을 .__ 검사 및 참조 : 
" "" 
>>> 디렉토리 (HauntedBus .__ init__)
[ '__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__DIR__', '__doc__', '__eq__', '__format__'을 ' __ge__ ','__get__ ','__getattribute__ ','__globals__ ','__gt__ ','__hash__ ','__init__ ','__init_subclass__ ','__kwdefaults__ ','__le__ ','__lt__ ','__module__를 ','__name__ ' '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 
>>> HauntedBus .__ INIT __.__ defaults__ 
( [ '캐리', '
>>> 
 
>>> HauntedBus .__ 초기화 __.__ 기본값 __ [ 0]이다 bus2.passengers"" " 
# 마지막으로, 우리가 bus2.passengers을 확인할 수 있습니다 것은 HauntedBus .__ 초기화 __.__ defaults__의 첫 번째 요소에 바인딩 별칭 속성입니다 : 
" "" 
진정한는 
"" " 

#은 아무도없는 이유를 변경할 디폴트와 문제 설명 종종 나타날 수 있습니다 매개 변수에 대한 기본값으로 사용 
# 변경 가능한 값을.

 

 

 

 

 

종료...

 

추천

출처www.cnblogs.com/neozheng/p/12275256.html