파이썬에서 단일 밑줄“_”변수의 목적은 무엇입니까?


618

이 코드에서 _after 의 의미는 무엇입니까 for?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1


5
귀하의 경우, len(tbh.bag.atom_set())(반환 된 값에 __len__방법 이있는 경우 ) 또는sum(1 for _ in tbh.bag.atom_set())
Nick T

에서 pylint더미 변수 이름에 대한 다른 옵션의 접두어 dummy_변수 이름. 와이 접두사를 사용하여 pylint만든다 pylint경고를 방출하지. 또한 pylint같은 변수를 수용 하기 위해 더미 변수 패턴을 구성 할 수 있습니다 __.
Trevor Boyd Smith

답변:


780

_ 파이썬에서 4 가지 주요 용도가 있습니다.

  1. 대화식 인터프리터 세션에서 마지막으로 실행 된 표현식 (/ statement)의 결과를 보유합니다. 이 선례는 표준 CPython 인터프리터에 의해 설정되었으며 다른 인터프리터도
  2. 다음 과 같은 코드에서와 같이 i18n에서 번역 조회 ( 예 : gettext 설명서 참조 ) : raise forms.ValidationError(_("Please enter a correct username"))
  3. 다음과 같은 코드에서와 같이 함수 결과의 일부가 의도적으로 무시되고 있음을 나타내는 일반적인 목적의 "throwaway"변수 이름입니다 (개념적으로 폐기 됨) label, has_label, _ = text.partition(':').
  4. 서명이 고정 된 (예 : 콜백 또는 부모 클래스 API) 함수 정의의 일부 ( def또는 lambda)를 사용 하지만이 특정 함수 구현에는 다음과 같은 코드와 같이 모든 매개 변수가 필요하지 않습니다.callback = lambda _: True

(오랫동안이 답변은 처음 세 가지 유스 케이스 만 나열했지만 네 번째 케이스는 여기 에 표시된대로 명시 적으로 나열 할 가치가 있을 정도로 자주 나타났습니다. )

후자의 "throwaway variable or parameter name"유스 케이스는 translation lookup 유스 케이스와 충돌 할 수 있으므로 _i18n 변환에도 사용되는 코드 블록에서 throwaway 변수로 사용하는 것을 피해야 합니다 (많은 사람들은 이중 밑줄을 선호합니다) ,, __정확히이 이유로 버리기 변수).


19
함수 호출에서 작동 방식을 설명 할 수 있습니다 (예 : raise forms.ValidationError (_ ( "올바른 사용자 이름을 입력하십시오"))) . 장고 코드에서 이것을 보았으며 무슨 일이 일어나고 있는지 명확하지 않습니다.
John C

41
즉, 사용법 2- _국제화 및 지역화 문자열 변환 조회를 수행하는 함수에 사용되는 이름입니다. gettext해당 컨벤션을 설정 한 것이 C 라이브러리라고 확신합니다 .
ncoghlan

43
FWIW, 나는 개인적 __으로 첫 두 유스 케이스 중 하나와 충돌을 피하기 위해 범용 이중 이동 변수로 (이중 밑줄)을 사용하기 시작했습니다 .
ncoghlan

14
신흥 커뮤니티 컨벤션은 권위있는 출처를 갖는 경향이 없으며 시간이 지남에 따라 나타난 관행에 대한 관찰 일뿐입니다. FWIW, 저는 최근 PEP 8 업데이트의 공동 저자 중 한 _명이며 2002 년에 전문적으로 Python을 사용하기 시작한 이후로 변수 이름으로 사용 된 3 가지 방법을 바탕으로 대답 했습니다.
ncoghlan

12
이 규약은 주로 튜플 포장 풀기를위한 것입니다 a, __, c = iterable. 독자에게 3 튜플의 포장을 풀고 있지만 첫 번째와 마지막 값만 사용한다고 알립니다. 우리가 대신 작성하는 경우 a, b, c = iterable, 독자 (또는 자동화 된 코드 린터가) 합리적으로 모두를 기대할 수 있습니다 a, b그리고 c나중에 사용할 수 있도록 (그들이하지 않으면, 그것은 버그 곳의 징후 일 수 있음).
ncoghlan

207

그것은 단지 변수 이름이며, 파이썬에서 _버리기 변수 에 사용 하는 것이 일반적입니다 . 루프 변수가 실제로 사용되지 않음을 나타냅니다.


5
마지막 반환 값을 나타내지 않는다는 의미입니까?
alwbtc

31
@ steve는 파이썬
Gabi Purcaru

4
Prolog에서 _를 사용하는 것과 유사
Matthias

3
Matlab에서 ~를 사용하는 것과 유사
PatriceG

명시 적으로을 정의하면 cpython 쉘 _에서 이전 표현식의 출력 값 보유를 영구적으로 중지합니다. 이것은 굉장히 일관되지 않은 것으로 보이며, 파이썬 언어 표준이이를 해결해야합니다. 그들은 그냥 _버림받은 이름으로 정의 하고 실제 식별자로 사용되는 것을 막아야합니다.
theferrit32

78

밑줄 _은 파이썬에서 " I do n't care "또는 " Throwaway "변수로 간주됩니다

  • 파이썬 인터프리터는 마지막 표현식 값을이라는 특수 변수에 저장합니다 _.

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
  • 밑줄 _은 특정 값을 무시하는 데에도 사용됩니다. 특정 값이 필요하지 않거나 값이 사용되지 않으면 값을 밑줄에 지정하십시오.

    포장 풀기시 값 무시

    x, _, y = (1, 2, 3)
    
    >>> x
    1
    
    >>> y 
    3

    색인 무시

    for _ in range(10):     
        do_something()

2
국제화 기능을위한 세 번째 사용법이 있습니다 _("Hello world!").
Jeff Younker

3
프로세서 수준에서 실제로 "범위의 _"와 "범위의 x"사이에 차이가 있습니까? 그리고 x를 사용하지 않습니까? 아니면 인간의 가독성만을위한 것인가?
iammax

1
@iammax dis모듈을 사용하면 바이트 코드에 차이가 없다는 것을 알았습니다. 그러나 사람의 가독성의 이점은 분명합니다.
Alistair Carscadden

21

파이썬에서 밑줄을 사용하는 경우는 5 가지가 있습니다.

  1. 인터프리터에 마지막 표현식의 값을 저장합니다.

  2. 특정 값을 무시합니다. (소위“나는 상관 없다”)

  3. vartiables 또는 기능의 이름에 특별한 의미와 기능을 부여합니다.

  4. '국제화 (i18n)'또는 '현지화 (l10n)'기능으로 사용합니다.

  5. 숫자 리터럴 값의 숫자를 구분합니다.

다음mingrammer의 예제가 포함 된 멋진 기사입니다 .


2
사실 그것은 아주 새로운 blog.pythonlibrary.org/2017/01/11/…
MichaelChirico

3

파이썬 언어에 관한 한 _특별한 의미는 없습니다. 그것은 유효한 식별자 단지와 같은 _foo, foo_또는 _f_o_o_.

특별한 의미 _는 순전히 관례입니다. 몇 가지 경우가 일반적입니다.

  • 변수를 사용하지 않을 때 더미 이름이지만 구문 / 의미론에 이름이 필요합니다.

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
  • 많은 REPL / 쉘은 마지막 최상위 식의 결과를에 저장합니다 builtins._.

    특수 식별자 _는 대화식 인터프리터에서 마지막 평가 결과를 저장하는 데 사용됩니다. builtins모듈에 저장됩니다 . 대화식 모드 _가 아닌 경우 특별한 의미가 없으며 정의되어 있지 않습니다. [ 출처 ]

    전역 또는 로컬 _정의에 의해 음영 처리되지 않는 한 이름이 조회되는 방식으로 인해 베어가 _참조합니다 builtins._.

    >>> 42
    42
    >>> f'the last answer is {_}'
    'the last answer is 42'
    >>> _
    'the last answer is 42'
    >>> _ = 4  # shadow ``builtins._`` with global ``_``
    >>> 23
    23
    >>> _
    4

    참고 : 와 같은 일부 쉘 ipython은 지정하지 않고 builtins._특수한 경우에 사용 _합니다.

  • 컨텍스트 국제화 및 현지화 _에서 기본 번역 함수의 별명으로 사용됩니다.

    gettext.gettext (메시지)

    현재 글로벌 도메인, 언어 및 로캘 디렉토리를 기반으로 현지화 된 메시지 번역을 반환합니다. 이 함수는 일반적으로 로컬 네임 스페이스에서 _ ()로 별칭이 지정됩니다 (아래 예 참조).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.