搜尋

首頁  >  問答  >  主體

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 天前1433

全部回覆(4)我來回復

  • 伊谢尔伦

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

    這個有點像javascript中的var
    在js中

    for(var i = 0; i < 100; i++){
        //内容
    }
    console.log(i);//i = 100

    因為js中var定义的变量的作用域是整个函数,所以ES6语法中增加了一个letlet定义的变量就是块级作用域
    如果是for(let i = 0; i < 100; i++),后面再log i的话就是undefined定義的變數的作用域是整個函數,所以ES6語法中增加了一個letlet定義的變數就是區塊級作用域

    如果是for(let i = 0; i < 100; i++),後面再log i的話就是undefined

    如果是java的話,也是區塊級作用域

    for(int i = 0; i < 100; i ++){
        //i在块级作用域范围内
    }

    你的程式碼就是java這種🎜

    回覆
    0
  • 怪我咯

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

    你改成這樣,印出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的作用域

    1. 在最內層查找,一般是在函數裡 ,locals()

    2. 在模組內查找,即globals()

    3. 在模組外查找,即__builtin__中查找

    回覆
    0
  • 高洛峰

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

    Python 沒有塊作用域

    最小的範圍是 函數

    回覆
    0
  • PHP中文网

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

    簡單來說,在python中只有模組,類,和函數才會產生新的作用域,所以for循環裡定義的變數在循環外也能訪問,只要他們在同一個作用域裡

    回覆
    0
  • 取消回覆