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...
4 回答

倚天杖
TA貢獻1828條經驗 獲得超3個贊
這個有點像javascript中的var
在js中
for(var i = 0; i < 100; i++){
//內容
}
console.log(i);//i = 100
因為js中var
定義的變量的作用域是整個函數,所以ES6語法中增加了一個let
,let
定義的變量就是塊級作用域
如果是for(let i = 0; i < 100; i++)
,后面再log i的話就是undefined
了
如果是java的話,也是塊級作用域
for(int i = 0; i < 100; i ++){
//i在塊級作用域范圍內
}
你的代碼就是java這種

FFIVE
TA貢獻1797條經驗 獲得超6個贊
你改成這樣,打印出locals()函數
def find(sequence, target):
for index, value in enumerate(sequence):
if value == target:
break
else:
return -1
print(locals())
return index
會發現輸出
{'index': 1, 'target': 1, 'value': 1, 'sequence': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
從輸出中可以看到index,value和target,sequence在同一個命名空間。因為他們都在同一函數里。所以是能夠訪問index的.
python的作用域
在最內層查找,一般是在函數里 ,locals()
在模塊內查找,即globals()
在模塊外查找,即__builtin__中查找
添加回答
舉報
0/150
提交
取消