이 문서에서는 기본 매개 변수 파이썬 트랩의 문제에 대해 얘기하는 것입니다 거의 필요 파트너를 참조 할 수있다
일반적인 함정 내부 파이썬의 문제의 기본 함수 매개 변수입니다. 으로는 다음과 같습니다 :
def func(mylist = []):
mylist.append(1)
return mylist
다음과 같이 다음과 같은 실행 결과는 다음과 같습니다
print func()
print func()
print func()
print func(['a'])
print func()
결과는 다음과 같다 :
[1]
[1, 1]
[1, 1, 1]
['a', 1]
[1, 1, 1, 1]
결과 그래서, 처음 세 개의 매개 변수가 지정되지 않은 경우, 다음마다 함수 호출, myList에 호출이 같은 오브젝트입니다 볼 수 있습니다. 이 함수의 기본 매개 변수는, 코드가 PyCodeObject 시간에 컴파일되어 있기 때문에, 그들은 개체 포인터를 만든이며, 기능은 func_default 내에있다. 코드가 실행 된 후 매개 변수가 지정되지 않은 경우, 호출 기능, 각 호출은 다음 인수 포인터 변수는 지정된 객체의 변수 코드 컴파일 단계입니다.
print func.func_default
이 경우 결과는 다음과 같습니다
([1, 1, 1, 1])
두 케이스의 디폴트 파라미터 :
초기 파라미터 값은 불변 대상인
내부 기능 수정 변수는, 디폴트 인수는 새로운 불변 오브젝트를 가리키고있는 경우,이 같은 주제에 관한 한이 시간 func_default 함수에서.
그러나 func_default 변하지. 그리고 각 호출 기능, 따라서 매번 같은 func_default을 읽습니다.
In [30]: def func2(var = 1):
....: var += 1
....: return var
....:
In [31]: func2()
Out[31]: 2
In [32]: func2()
Out[32]: 2
In [34]: func2.func_defaults
Out[34]: (1,)
기본 매개 변수 등 목록, 딕셔너리, 클래스로 변경 가능한 객체이며,
당신이 함수에서 객체 포인터를 수정하면, (새로운 객체를 생성하지 않음)이 경우, 다음 func_default이 변경됩니다. 이 변화의 myList에 원인의 시작입니다. 다음 예를 살펴 :
In [35]: def func(mylist = []):
....: mylist = [] #这里 创建了新的对象,
mylist.append(1)
return mylist
In [44]: func()
Out[44]: [1]
In [45]: func.func_defaults
Out[45]: ([],)
오브젝트가 작성되기 때문에, 변경 func_default와는 아무 상관 없었다 뒤에 새 대상 별칭이 존재 myList에 것처럼.
기본 응용 프로그램 매개 변수
아래의 고전적인 예를 살펴 보겠습니다 :
def outer():
res = []
for i in range(4):
def inner(j):
return j * i
res.append(inner)
return res
print [m(2) for m in outer()]
# 발췌 버전 :
def multipliers():
return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]
대신 [0, 2, 4, 6]의 결과 [6,6, 6,6]으로 결합하기 때문에 지연에 고정된다. 또한 함수는 결합 된 변수 값 대신 바인딩이다. 난이 경우 3, 6이다의주기의 마지막에, 가치가있는 경우 결과가 기본값 파라미터 바인딩하는 솔루션이다. 다음과 같은 변경 :
def outer():
res = []
for i in range(4):
def inner(j, i = i):
return j * i
res.append(inner)
return res
print [m(2) for m in outer()]
# 발췌 버전 :
def multipliers():
return [lambda x, i = i : i * x for i in range(4)]
print [m(2) for m in multipliers()]
이 경우, 코드 컴파일 시간의 기본 매개 변수를 사용하여,이 매개 변수를 사용하면 0, 1, 2, 3을 결합 할 수 func_default 기능을 작성했다. 그것은 그 자연이었다
[0, 2, 4, 6]
이 응용 디폴트 파라미터이다.
이상과 수정 된 형태 발생기
def multipliers():
return (lambda x, i = i : i * x for i in range(4)) #修改成生成器
print [m(2) for m in multipliers()]
마지막으로, 우리는 매우 넓은 파이썬 학습 자원 수집을 추천, [입력 클릭] , 여기에 사업 경험의 기회가, 경험, 연구 노트를 학습하기 전에 내 컬렉션이며, 프로젝트의 전투에 대한 정보를 바탕으로 제로로 진정 우리는 아래에, 앞으로 넣어 모르는 메시지를 남길 수 있습니다 우리는 진행 상황을 함께 공부합니다