산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python 네임스페이스 및 범위

Python 네임스페이스 및 범위

이 자습서에서는 이름 공간, 이름에서 개체로의 매핑, 변수 범위에 대해 배웁니다.

파이썬에서 이름이란 무엇입니까?

'Zen of Python'(import this 입력)을 읽은 적이 있다면 Python 인터프리터에서), 마지막 줄은 네임스페이스는 경적을 울리는 훌륭한 아이디어 중 하나입니다. 더 많이 해봅시다! 그렇다면 이 신비한 네임스페이스는 무엇일까요? 먼저 이름이 무엇인지 살펴보겠습니다.

이름(식별자라고도 함)은 단순히 객체에 부여된 이름입니다. 파이썬의 모든 것은 객체입니다. 이름은 기본 개체에 액세스하는 방법입니다.

예를 들어 a = 2 할당을 수행할 때 , 2 메모리에 저장된 객체이고 a 우리가 연결하는 이름입니다. 내장 함수 id()를 통해 일부 객체의 주소(RAM)를 얻을 수 있습니다. . 사용 방법을 살펴보겠습니다.

# Note: You may get different values for the id

a = 2
print('id(2) =', id(2))

print('id(a) =', id(a))

출력

id(2) = 9302208
id(a) = 9302208

여기에서 둘 다 동일한 개체 2를 참조합니다. , 따라서 동일한 id() . 좀 더 흥미롭게 만들어 봅시다.

# Note: You may get different values for the id

a = 2
print('id(a) =', id(a))

a = a+1
print('id(a) =', id(a))

print('id(3) =', id(3))

b = 2
print('id(b) =', id(b))
print('id(2) =', id(2))

출력

id(a) = 9302208
id(a) = 9302240
id(3) = 9302240
id(b) = 9302208
id(2) = 9302208

위의 일련의 단계에서 무슨 일이 일어나고 있습니까? 다이어그램을 사용하여 이를 설명하겠습니다.

<그림>

처음에 개체 2 생성되고 이름 a a = a+1을 수행할 때 연결됩니다. , 새 개체 3 생성되었으며 이제 a 이 개체와 연결되어 있습니다.

id(a)id(3) 동일한 값을 갖습니다.

또한 b = 2일 때 실행되면 새 이름 b 이전 개체 2와 연결됩니다. .

이것은 파이썬이 새로운 복제 객체를 생성할 필요가 없기 때문에 효율적입니다. 이름 바인딩의 이러한 동적 특성은 Python을 강력하게 만듭니다. 이름은 모든 유형의 개체를 참조할 수 있습니다.

>>> a = 5
>>> a = 'Hello World!'
>>> a = [1,2,3]

모두 유효하며 a 다른 인스턴스에서 세 가지 다른 유형의 객체를 참조합니다. 함수도 객체이므로 이름에서도 참조할 수 있습니다.

def printHello():
    print("Hello")


a = printHello

a()

출력

Hello

같은 이름 a 함수를 참조할 수 있으며 이 이름을 사용하여 함수를 호출할 수 있습니다.

<시간>

파이썬에서 네임스페이스란 무엇입니까?

이제 이름이 무엇인지 이해했으므로 네임스페이스 개념으로 넘어갈 수 있습니다.

간단히 말해서 네임스페이스는 이름의 모음입니다.

Python에서는 네임스페이스를 정의한 모든 이름을 해당 개체에 매핑하는 것으로 상상할 수 있습니다.

서로 다른 네임스페이스는 주어진 시간에 공존할 수 있지만 완전히 분리되어 있습니다.

모든 내장 이름을 포함하는 네임스페이스는 파이썬 인터프리터를 시작할 때 생성되며 인터프리터가 실행되는 한 존재합니다.

이것이 id()과 같은 내장 함수가 , print() 등은 프로그램의 어느 부분에서나 항상 사용할 수 있습니다. 각 모듈은 자체 전역 네임스페이스를 생성합니다.

이러한 서로 다른 네임스페이스는 격리됩니다. 따라서 다른 모듈에 존재할 수 있는 동일한 이름이 충돌하지 않습니다.

모듈은 다양한 기능과 클래스를 가질 수 있습니다. 모든 이름이 정의된 함수가 호출될 때 로컬 네임스페이스가 생성됩니다. 클래스의 경우도 마찬가지입니다. 다음 다이어그램은 이 개념을 명확히 하는 데 도움이 될 수 있습니다.

<그림> <시간>

Python 변수 범위

다양한 고유한 네임스페이스가 정의되어 있지만 프로그램의 모든 부분에서 모든 네임스페이스에 액세스할 수는 없습니다. 범위의 개념이 작동합니다.

범위는 접두사 없이 네임스페이스에 직접 액세스할 수 있는 프로그램 부분입니다.

주어진 순간에 적어도 세 개의 중첩 범위가 있습니다.

  1. 로컬 이름이 있는 현재 함수의 범위
  2. 글로벌 이름을 가진 모듈의 범위
  3. 내장된 이름이 있는 가장 바깥쪽 범위

함수 내에서 참조가 만들어지면 로컬 네임스페이스에서 이름을 검색한 다음 전역 네임스페이스에서, 마지막으로 내장 네임스페이스에서 이름을 검색합니다.

다른 함수 안에 함수가 있으면 새 범위가 로컬 범위 안에 중첩됩니다.

<시간>

Python의 범위 및 네임스페이스 예

def outer_function():
    b = 20
    def inner_func():
        c = 30

a = 10

여기서 변수 a 전역 네임스페이스에 있습니다. 변수 b outer_function()의 로컬 네임스페이스에 있습니다. 및 c inner_function()의 중첩된 로컬 네임스페이스에 있습니다. .

inner_function()에 있을 때 , c 우리 지역에 있습니다. b 로컬이 아니며 a 글로벌합니다. c에 새 값을 할당하고 읽을 수 있습니다. 그러나 b만 읽을 수 있습니다. 및 a inner_function()에서 .

b에 값으로 할당하려고 하면 , 새 변수 b 로컬이 아닌 b와 다른 로컬 네임스페이스에 생성됩니다. . a에 값을 할당할 때도 마찬가지입니다. .

그러나 를 선언하면 전역으로 모든 참조 및 할당은 전역 a로 이동합니다. . 마찬가지로 b 변수를 다시 바인딩하려는 경우 , nonlocal로 선언해야 합니다. 다음 예는 이를 더욱 명확하게 설명합니다.

def outer_function():
    a = 20

    def inner_function():
        a = 30
        print('a =', a)

    inner_function()
    print('a =', a)


a = 10
outer_function()
print('a =', a)

보시다시피 이 프로그램의 출력은

a = 30
a = 20
a = 10

이 프로그램에서 세 가지 다른 변수 a 별도의 네임스페이스에 정의되고 그에 따라 액세스됩니다. 다음 프로그램에 있는 동안

def outer_function():
    global a
    a = 20

    def inner_function():
        global a
        a = 30
        print('a =', a)

    inner_function()
    print('a =', a)


a = 10
outer_function()
print('a =', a)

프로그램의 출력은 다음과 같습니다.

a = 30
a = 30
a = 30 

여기에서 모든 참조 및 할당은 전역 a global 키워드 사용으로 인해 .


python

  1. 파이썬 키워드와 식별자
  2. Python 문, 들여쓰기 및 주석
  3. Python 변수, 상수 및 리터럴
  4. Python 유형 변환 및 유형 캐스팅
  5. 파이썬 입력, 출력 및 가져오기
  6. 파이썬 연산자
  7. Python 전역, 지역 및 비지역 변수
  8. 파이썬 숫자, 유형 변환 및 수학
  9. Python 디렉토리 및 파일 관리
  10. Python 오류 및 내장 예외