범위를 수정하는 Python의 5가지 포인트

大家讲道理
풀어 주다: 2016-11-07 10:43:37
원래의
1078명이 탐색했습니다.

1. 블록 수준 범위

이때 다음 프로그램을 실행하면 출력이 나오나요? 처형은 성공할 것인가?

#块级作用域
if 1 == 1:
    name = "lzl"
print(name)
for i in range(10):
    age = i
print(age)
로그인 후 복사

먼저 실행 결과를 살펴보겠습니다

C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py
lzl
9
 Process finished with exit code 0
로그인 후 복사

코드가 성공적으로 실행되었으며 Java/C#에서는 문제가 없습니다. 위 코드를 실행하면 다음과 같은 메시지가 나타납니다. name과 age는 정의되어 있지 않으며, Python에는 블록 수준 범위가 없으므로 코드 블록의 변수를 외부에서 호출할 수 있으므로 성공적으로 실행할 수 있습니다.

2. 로컬 범위

앞서 배운 내용을 살펴보면, 함수를 배울 때 함수는 별도의 범위가 있지만, Python에는 블록 수준 범위가 있습니다. 로컬 범위; 다음 코드를 살펴보세요

이 코드를 실행하고 출력이 있는지 궁금하십니까?
#局部作用域
def  func():
    name = "lzl"
print(name)
로그인 후 복사

실행 오류입니다. 누구나 이해할 수 있을 거라 믿습니다. name 변수는 func() 함수 내에서만 적용되므로 전역적으로 호출할 수 없습니다. 위 코드를 간단히 조정해 보겠습니다. 결과는 어떻습니까?
Traceback (most recent call last):
  File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
    print(name)
NameError: name &#39;name&#39; is not defined
로그인 후 복사
로그인 후 복사

이전 코드에 한 줄의 코드를 추가합니다. 변수 이름이 인쇄되기 전에 이때 인쇄가 변경됩니까?
#局部作用域
  
def  func():
    name = "lzl"
  
func()          #执行函数
print(name)
로그인 후 복사

실행 시 여전히 오류가 보고됩니다. 방금 문장으로 돌아가 보겠습니다. 함수가 실행되더라도 이름의 범위는 함수 내부에만 있고 여전히 외부에서 호출할 수 없습니다. ; 처음 두 가지 지식 포인트를 기억하세요 잠깐만요, 다음 증폭 동작을 시작하겠습니다
Traceback (most recent call last):
  File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>
    print(name)
NameError: name &#39;name&#39; is not defined
로그인 후 복사
로그인 후 복사

3. 스코프 체인

함수를 조정하고 다음의 실행 결과를 확인하세요. 코드는?

함수를 배웠으니 f1()이 실행된 후에 Snor가 출력된다는 점을 먼저 알아야 합니다. Python에는 범위 체인이 있습니다. 외부. 먼저 자신에게 가세요. 스코프를 찾으려고 상사에게 가지 않았는데 못 찾고 오류가 발생했습니다
#作用域链
  
name = "lzl"
def f1():
    name = "Eric"
    def f2():
        name = "Snor"
        print(name)
    f2()
f1()
로그인 후 복사

4. 범위

자, 예감은 충분, 궁극의 버전이 나왔습니다~~

f2()
#终极版作用域
  
name = "lzl"
  
def f1():
    print(name)
  
def f2():
    name = "eric"
    f1()
로그인 후 복사

최종 실행 여부를 생각해 보세요 f2()의 결과는 "lzl" 또는 "eric"을 인쇄하는 것입니까? 지금 답변을 게시하는 대신 다음 코드를 살펴보세요.

위 코드를 분석하면 f2() 실행 결과는 메모리입니다. 즉, ret()을 실행하는 것은 f1()을 실행하는 것과 같습니다. f2()와는 아무런 관련이 없습니다. 같은 스코프 체인에서 함수 내부에 변수가 없으면 밖을 내다보게 되므로 이때 변수명의 값은 "lzl" 이라는 것을 이해하시면 최종 코드에 대한 답도 알 수 있습니다. 방금 답변이 제공되지 않았습니다
#终极版作用域
  
name = "lzl"
  
def f1():
    print(name)
  
def f2():
    name = "eric"
    return f1
  
ret = f2()
ret()
  
#输出:lzl
로그인 후 복사

#终极版作用域
  
name = "lzl"
  
def f1():
    print(name)
  
def f2():
    name = "eric"
    f1()
  
f2()
로그인 후 복사

# 출력: lzl

예, 출력은 "lzl"입니다. 함수가 실행되기 전에, 스코프가 형성되고 스코프 체인도 생성됩니다

5. 시나 면접 질문

리 유형을 결정하세요? li의 요소는 어떤 유형입니까?
li = [lambda :x for x in range(10)]
로그인 후 복사

li가 목록 유형이고 목록의 요소가 함수임을 알 수 있습니다. 그러면 목록의 첫 번째 요소의 반환 값이 출력됩니다.
print(type(li))
print(type(li[0]))
  
# <class &#39;list&#39;>
# <class &#39;function&#39;>
로그인 후 복사

#lambada 인터뷰 질문

#Output: 9
li = [lambda :x for x in range(10)]
  
res = li[0]()
print(res)
로그인 후 복사

li첫 번째 함수의 반환 값은 9이지만 0은 아닙니다. 기억하세요: 함수는 이전에 실행되지 않습니다. , 내부 코드는 실행되지 않으며 블로그에서 직접 코드를 연습하여 인상을 깊게 할 수 있습니다

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿