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++)
,后面再log i的话就是undefined
定義的變數的作用域是整個函數,所以ES6語法中增加了一個let
,let
定義的變數就是區塊級作用域for(let i = 0; i ,後面再log i的話就是
如果是java的話,也是區塊級作用域
你的程式碼就是java這種🎜
undefined
了你改成這樣,印出locals()函數
會發現輸出
從輸出可以看到index,value和target,sequence在同一個命名空間。因為他們都在同一函數裡。所以是能夠訪問index的.
python的作用域
在最內層查找,一般是在函數裡 ,locals()
在模組內查找,即globals()
在模組外查找,即__builtin__中查找
Python 沒有塊作用域
最小的範圍是 函數
簡單來說,在python中只有模組,類,和函數才會產生新的作用域,所以for循環裡定義的變數在循環外也能訪問,只要他們在同一個作用域裡