2016-07-19 1 views
1

기본값은 정의시 구문 분석됩니다. 그래서 이것은 작동하지 않을 것이다자체를 기본 인수로 사용하는 함수

def f(x, func = f): 
    if x<1: 
     return x 
    else: 
     return x + func(x-1) 

나는 길을 발견했다. 좀 더미 기능

def a(x): 
    return x 

def f(x, func=a): 
    if x < 1: 
     return x 
    else: 
     return x + func(x-1) 

시작 그리고

f.__defaults__ = (f,) 

분명히 어색 실행합니다. 다른 방법이 있습니까? 아니면이 나쁜 파이썬입니까? 그것이 나쁘다면 왜 설명 할 수 있니? 어디에서 깰 수 있을까요? 어떤 경우

, 그것은 작동합니다

def f(x, func=None): 
    if func is None: 
     func = f 

    if x < 1: 
     return x 
    else: 
     return x + func(x-1) 

그것은을 구현하는 파이썬에서 꽤 표준 관용구는 다음과 같습니다 안드레아 Corbellini의 제안에 정교하게

In [99]: f(10) 
Out[99]: 55 

In [100]: f(10, f) 
Out[100]: 55 

In [101]: f(10, lambda x : 2*x) 
Out[101]: 28 
+6

왜 '없음'을 사용하지 않으시겠습니까? –

+5

당신은 왜 그것을하고 싶습니까? XY 문제처럼 냄새가납니다. 너 정말로 무엇을하려고하는거야? – DeepSpace

+2

이것은 재귀와 같습니다. 함수에서'func'을'f'로 대체 할 수 있습니다. –

답변

3

, 당신은 이런 식으로 뭔가를 할 수 list과 같은 변경 가능한 기본값이있는 문제로 인해 함수 내부의 실제 기본값이 None (또는 None이 유효한 입력 인 경우 개인 프라이버시 객체)으로 정의됩니다.

관련 문제