찾다

 >  Q&A  >  본문

python - for...in 中的局部变量, 为何能在外面使用?

2016/11/20

问题

详情见代码

Python 作为高级语言, 抽象层次很高, 然一个程序员一般都会好几门语言, 有时候会在语言的细节处, 发生概念性的混淆

  1. 有点害怕, 是不是一直误解了 Python 的作用域原理?

  2. 正确的作用域原理是什么?

答案: LEGB法则

初学 Python 语法的时候, 由于觉得这东西太复杂, 就快速跳过了, 没想到是个坑( maybe feature ? )

相关代码

def find(sequence, target):
    for index, value in enumerate(sequence):
        if value == target:
            break
    else:
        return -1
    return index  # ?? 这里是否可表示 index 已经逃离 for...in 作用域了?

print find(range(10), 1)


for iii in range(10):
    iii += 1
print iii

一直以为是这样的
for (int i=0; i<10; ++i)
    do something                       # i的作用域在 for 中

重现

  1. 拷贝代码, 运行

尝试解决

  1. 搜索了 Python 作用域的相关介绍

  2. https://www.zhihu.com/questio...

怪我咯怪我咯2806일 전1432

모든 응답(4)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:59:28

    이것은 javascript의 var
    js의

    과 약간 비슷합니다. 으아악

    js에서 var으로 정의한 변수의 범위는 함수 전체이므로 ES6 구문에는 let으로 정의한 변수가 let인 경우가 추가됩니다.
    입니다. 나중에 로그인하면 for(let i = 0; i < 100; i++)undefined이 됩니다.

    자바라면 역시 블록레벨 스코프입니다

    으아악

    귀하의 코드는 Java와 같습니다

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 09:59:28

    이것으로 변경하고 locals() 함수를 출력하세요

    으아악

    출력을 찾습니다

    으아악

    출력에서 인덱스, 값, 대상 및 시퀀스가 ​​동일한 네임스페이스에 있음을 확인할 수 있습니다. 둘 다 동일한 기능을 수행하기 때문입니다. 그래야 색인에 접근할 수 있습니다.

    Python의 범위

    1. 가장 안쪽 수준에서 검색하며 일반적으로 locals() 함수에서 검색합니다.

    2. 모듈 내에서 검색(예: globals())

    3. 모듈 외부에서 검색, 즉 __builtin__에서 검색

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:59:28

    파이썬에는 블록 범위가 없습니다

    가장 작은 범위는 함수

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:59:28

    간단히 말하면 Python에서는 모듈, 클래스, 함수만 새 범위를 생성하므로 for 루프에 정의된 변수는 동일한 범위에 있는 한 루프 외부에서도 액세스할 수 있습니다.

    회신하다
    0
  • 취소회신하다