English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서, 이름에서 객체로의 매핑 및 변수의 범위에 대해 배울 것입니다.
당신이 'Python의 철학(The Zen of Python)'을 읽었던 적이 있다면, Python 인터프리터에서 import this를 입력하면 마지막 줄이,이름 공간은 매우 좋은 아이디어입니다-더 많은 일을 해보겠습니다!그래서 이들 미스터리스한 이름 공간은 무엇인가요? 우선 이름이 무엇인지 보겠습니다.
이름(도称为标识符)은 객체에 부여된 이름입니다. Python에서 모든 것은객체이름은 기본 객체에 접근하는 방법입니다.
예를 들어, 할당 연산을 수행할 때 a = 2,2메모리에 저장된 객체입니다.a과 연결된 이름입니다. 다음으로 어떻게 사용할 수 있는지 보겠습니다.내장 함수 어떻게 사용할 수 있는지 보겠습니다. 특정 객체의 주소(RAM에서)를 id()로 가져옵니다.
# 주의: 다른 id 값이 나올 수 있습니다 a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
출력 결과
id(2) = 9302208 id(a) = 9302208
여기서 두 가지 모두 같은 객체를 참조합니다2따라서 같은 id()를 가집니다. 재미있는 일을 해보겠습니다.
# 주의: 다른 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
위 단계 시퀀스에서 무엇이 일어났는지 설명해 보겠습니다. 아래 그래프로 설명하겠습니다:
초기적으로, 객체를 생성합니다.2a = a + 1이 때 새로운 객체가 생성됩니다.3과 연결되면, a와 해당 객체가 연결됩니다.
주의하십시오, id(a)와 id(3)와 동일한 값이 있습니다.
또한, b = 2b와 연결된 새 이름2관련됩니다.
이것은 유효합니다. 왜냐하면 Python은 새로운 중복 객체를 생성하지 않기 때문입니다. 이름 바인딩의 이러한 동적 특성이 Python을 강력하게 만듭니다. 이름은 어떤 유형의 객체를 참조할 수 있습니다.
>>> a = 5 >>> a = 'Hello World!' >>> a = [1,2,3]
모두 유효하며a다른 예제에서 세 가지 다른 유형의 객체를 참조할 것입니다.함수같은 이름도 객체와 연결될 수 있습니다. 따라서 이름도 그들을 참조할 수 있습니다.
def printHello(): print("Hello") a = printHello a()
출력 결과
Hello
동일한 이름a함수를 참조할 수 있으며, 그 이름을 사용하여 함수를 호출할 수 있습니다.
이름이 무엇인지 이해한 후, 이름 공간 개념을 이어 나갈 수 있습니다.
결론적으로, 이름 공간은 이름의 집합입니다.
Python에서 이름 공간을 이미지화할 수 있습니다. 각 이름이 해당 객체에 대한 매핑입니다.
다른 이름 공간은 동시에 존재할 수 있지만 완전히 고립되어 있습니다.
Python 설명자를 시작할 때, 모든 내장 이름이 포함된 이름 공간이 생성되며, 그 설명자가 실행되는 동안 이 이름 공간이 존재합니다.
이것이 내장 기능(예: id()) print() 등이 프로그램의 어떤 부분에서든 사용할 수 있는 이유입니다. 각모듈자신의 전역 이름 공간을 생성합니다.
이 다른 이름 공간은 고립되어 있습니다. 따라서 다른 모듈에서 존재할 수 있는 동일한 이름은 충돌하지 않습니다.
모듈은 다양한 기능과 클래스를 가질 수 있습니다. 함수 호출 시 지역 이름 공간이 생성되며, 모든 이름이 정의됩니다. 클래스와 유사합니다. 아래 그래프는 이 개념을 설명하는 데 도움이 될 수 있습니다.
다양한 독특한 이름 공간이 정의되었지만, 프로그램의 각 부분에서 그들을 접근할 수 없을 수도 있습니다. 범위 개념이 작용하기 시작합니다.
스코프는 프로그램의 일부로서, 그곳에서 직접 이름 공간에 접근할 수 있으며 전치가 필요하지 않습니다.
在任何给定时刻,至少有三个嵌套作用域。
具有本地名称的当前函数的作用域
具有全局名称的模块的作用域
具有内置名称的最外部作用域
在函数内部进行引用时,将在本地命名空间中搜索名称,然后在全局命名空间中搜索,最后在内置命名空间中搜索。
如果一个函数中有一个函数,则新作用域嵌套在本地作用域内。
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和ainner_function()。
如果我们尝试分配作为值b,一个新的变量b在本地命名空间比非本地不同的创建b当我们分配一个值,同样的事情发生한 가지.
하지만, 그를 전체로 선언하지 않으면,a전체로 선언된 global a를 통해 모든 참조와 할당이 전체로 이동합니다.a다시 말해, 변수를 다시 연결하고 싶다면,b그러면, 그를 비로써 변수로 선언해야 합니다. 이 점을 더욱 명확히 설명하기 위해 다음 예제를 제공합니다.
def outer_function(): a = 20 def inner_function(): a = 30 print('a = inner_function() print('a = a = 10 print('a =
그렇게 보면, 이 프로그램의 출력은
a = 30 a = 20 a = 10
이 프로그램에서는, 다른 이름 공간에서 세 가지 다른 변수를 정의했습니다.a그리고 이에 대한 접근을 했습니다. 다음 프로그램에서는,
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a = inner_function() print('a = a = 10 print('a =
프로그램의 출력은.
a = 30 a = 30 a = 30
여기서는 키워드 global을 사용하여 모든 참조와 할당이 전체로 향합니다.