#연구/#Python

[파이썬/Python] 파이썬에서 사용하는 단일 밑줄과 이중 밑줄로 표현된 변수와 함수의 의미는? #파이썬 이중 밑줄 함수 의미 #파이썬 단일 밑줄 #파이썬 단일 선행 밑줄 #파이썬 단일 밑줄 _ 의 의..

every7hing 2020. 8. 21. 19:22
반응형

 

파이썬에서 사용하는 단일 밑줄과 이중 밑줄로 표현된 변수와 함수의 의미는?

#파이썬 이중 밑줄 함수 의미

#파이썬 단일 밑줄

#파이썬 단일 선행 밑줄

#파이썬 단일 밑줄 _ 의 의미

#파이썬 _ 변수는 언제 사용하는 것일까

#_var #var_ #__var__ #__var #_

 

1. _var

단일 선행 밑줄 변수나 함수는 통상적으로 프로그래머에게 힌트를 주는 용도입니다. 해당 변수는 내부에서만 사용하는 변수라는 의미를 주기 위함입니다. 그렇다고 해서 파이썬 인터프리터에서 이것을 그렇게 해석하지는 않습니다. 그냥 하나의 코딩 컨벤션? 같은 것이지요.

class Sample:
  def __init__(self):
    self.var = 0
    self._iVar = 1

 

2. var_

단일 후행 밑줄 변수를 사용하는 경우는, 대부분 사용하고자 하는 단어가 파이썬 인터프리터에 의해 이미 정의되어 있어서 사용하지 못하는 경우가 있습니다. 그래서 충돌이 일어나죠. 따라서 그런 경우를 피하기 위해 쓰는 경우가 많습니다.

def some_func(class): # rasie error
def some_func(class_): # it's ok

 

3. __var

이중 선행 밑줄 변수는 프로그래머와의 힌트나 약속을 넘어 인터프리터의 해석에 영향을 미칩니다. 파이썬에서는 서브 클래스에서 이름의 충돌을 피하기 위해 name mangling 이라는 개념을 사용하여 충돌을 어렵게 한다. 따라서 이처럼 사용하면 서브 클래스에서 동일하게 사용된 이름이 있더라도 인터프리터에서 충돌을 피하게 해준다.

class Sample:
  def __init__(self):
    self.var = 0
    self.__iVar = 1

s = Sample()
print(dir(s))

 

위 예제 코드의 결과를 살펴보면,

['_Sample__iVar', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'var']

 

var 변수의 이름은 바뀌지 않고 그대로인 반면에, __iVar 변수의 이름은 어떤가요?

그냥 __iVar 이름의 변수는 보이지 않고, _Sample__iVar 이라는 이름이 있는 것을 볼 수 있죠.

파이썬 인터프리터가 재 생성한 __iVar 변수의 이름이라고 볼 수 있어요. 이렇게 인터프리터는 충돌을 피하도록 한다는 거죠.

 

4. __var__

이중 선행 및 후행 밑줄을 가진 변수 또한 존재합니다. 이것은 앞의 이중 선행 밑줄을 가졌다하더라도, 이중 후행 밑줄을 동시에 가진다면 인터프리터에 의해 이름이 변경되지 않고 보호됩니다. 보통은 특수 용도로 사용하도록 예약되어 있습니다. 객체의 초기화나 (__init__) 또는 객체를 호출하는 (__call__)용도로 사용하도록 말이죠.

 

5. _

단일 밑줄이 있습니다. 단일 밑줄을 사용하는 경우는 보통 변수가 일시적이거나 중요하지 않음을 나타낼 때 사용합니다. 예를 들면 아래와 같은 for문 사용시, 굳이 해당 변수를 사용할 일이 없거나, 중요하지 않을 때 _ 를 사용할 수 있다는 것이죠.

for _ in range(10):
  print('Hello World!')

 

반응형