2016/11/20
详情见代码
Python 作为高级语言, 抽象层次很高, 然一个程序员一般都会好几门语言, 有时候会在语言的细节处, 发生概念性的混淆
有点害怕, 是不是一直误解了 Python 的作用域原理?
正确的作用域原理是什么?
答案: 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 中
拷贝代码, 运行
搜索了 Python 作用域的相关介绍
https://www.zhihu.com/questio...
이것은 javascript의
과 약간 비슷합니다. 으아악var
js의
js에서
자바라면 역시 블록레벨 스코프입니다var
으로 정의한 변수의 범위는 함수 전체이므로 ES6 구문에는let
으로 정의한 변수가let
인 경우가 추가됩니다.입니다. 나중에 로그인하면
for(let i = 0; i < 100; i++)
undefined
이 됩니다.으아악
귀하의 코드는 Java와 같습니다이것으로 변경하고 locals() 함수를 출력하세요
으아악출력을 찾습니다
으아악출력에서 인덱스, 값, 대상 및 시퀀스가 동일한 네임스페이스에 있음을 확인할 수 있습니다. 둘 다 동일한 기능을 수행하기 때문입니다. 그래야 색인에 접근할 수 있습니다.
Python의 범위
가장 안쪽 수준에서 검색하며 일반적으로 locals() 함수에서 검색합니다.
모듈 내에서 검색(예: globals())
모듈 외부에서 검색, 즉 __builtin__에서 검색
파이썬에는 블록 범위가 없습니다
가장 작은 범위는 함수
간단히 말하면 Python에서는 모듈, 클래스, 함수만 새 범위를 생성하므로 for 루프에 정의된 변수는 동일한 범위에 있는 한 루프 외부에서도 액세스할 수 있습니다.