파이썬 기능 자습서 : 파이썬 기본 트랩 매개 변수 문제

이 문서에서는 기본 매개 변수 파이썬 트랩의 문제에 대해 얘기하는 것입니다 거의 필요 파트너를 참조 할 수있다
일반적인 함정 내부 파이썬의 문제의 기본 함수 매개 변수입니다. 으로는 다음과 같습니다 :

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()]

마지막으로, 우리는 매우 넓은 파이썬 학습 자원 수집을 추천, [입력 클릭] , 여기에 사업 경험의 기회가, 경험, 연구 노트를 학습하기 전에 내 컬렉션이며, 프로젝트의 전투에 대한 정보를 바탕으로 제로로 진정 우리는 아래에, 앞으로 넣어 모르는 메시지를 남길 수 있습니다 우리는 진행 상황을 함께 공부합니다

게시 34 개 원래 기사 · 원의 찬양 (51) ·은 40000 +를 볼

추천

출처blog.csdn.net/haoxun10/article/details/104806237