2013-01-03 3 views
2

재미있는 (잠재적으로 어리석은) 생각이 들었다. 내장 함수 이름을 변수로 사용하여 정수를 말하면 어떻게 될까? 여기에 내가 시도 내용은 다음과 같습니다 파이썬에서 함수 이름을 변수로 사용하기

>>> a = [1,2,3,4] 
>>> len(a) 
4 
>>> len = 1 
>>> len(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: 'int' object is not callable 

다르게 기능과 변수 이름을 취급하지 않는 파이썬처럼 보인다

. 파이썬 인터프리터를 다시 시작하지 않고도 len을 다시 함수에 할당 할 수 있습니까? 또는 할당을 취소하십시오 len = 1?

+0

파이썬은 함수와 메쏘 드를 퍼스트 클래스 객체로 취급합니다. 따라서 함수에 할당하고 주위의 다른 함수로 전달할 수 있습니다. –

+0

파이썬은 함수와 변수 이름을 다르게 취급하지 않습니다. 이것은 Ruby의': func', Lisp의''func' 등과 같은 것을 할 필요없이 함수를 퍼스트 클래스 객체로 사용할 수있게하는 열쇠입니다. – abarnert

+2

실제로 덮어 쓰지 않아도됩니다. 새로운'len' 변수를 지우면 내장 된 이름이 제거됩니다. '__builtin__'에서 가져올 필요가 없습니다. – Keith

답변

12

은 기술적으로는 __builtin__

from __builtin__ import len 

에서 다시 얻을 수 그러나 물건 len의 이름을 지정하지 마십시오, 그것은 현명한 프로그래머는 화가 있습니다.

좋아, 다른 기능은 다음 예를 들어

import time 
time.asctime() 
asctime = 4253 
time.asctime() # Notice that asctime here is unaffected as its inside the time module(s) namespace 
+0

나는'len'을 변수 이름으로 사용해서는 안된다는 데 동의합니다. 하지만 다른 모듈에 정의 된 함수 이름을 덮어 쓰지 않도록하려면 어떻게해야합니까? –

+0

위의 편집을 참조하십시오. –

+1

의미가 있습니다. 필요한 기능 만 가져 오는 것은 나쁜 습관으로 간주됩니까? 'from time import asctime'이 방법으로 네임 스페이스를 지정하지 않고'asctime()'을 호출 할 수있다. –

17

사용 del len 네임 스페이스를 존중하고 존중하려는 두 번째 경우, 내장 매크로 후에 당신의 변수 이름없는 시작을위한 :에서

>>> a=[1,2,3,4] 
>>> len=15 
>>> len(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not callable 
>>> del len 
>>> len(a) 
4 

docs.python.org :

이름 삭제는 해당 이름의 바인딩을 제거합니다. 이름이 동일한 코드 블록의 전역 명령문에서 발생하는지 여부에 따라 로컬 또는 전역 이름 공간에서 가져옵니다. 이름이 언 바운드되면 NameError 예외가 발생합니다.

+2

꽤 매끈합니다. –

+0

+1 설명서 참조 – vkontori

관련 문제