为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梵蒂冈之花 2019-02-25 03:04:08
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语法中增加了一个letlet定义的变量就是块级作用域
如果是for(let i = 0; i < 100; i++),后面再log i的话就是undefined

如果是java的话,也是块级作用域

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

你的代码就是java这种

查看完整回答
反对 回复 2019-03-04
?
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的作用域

  1. 在最内层查找,一般是在函数里 ,locals()

  2. 在模块内查找,即globals()

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

查看完整回答
反对 回复 2019-03-04
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

Python 没有块作用域

最小的范围是 函数

查看完整回答
反对 回复 2019-03-04
?
慕慕森

TA贡献1856条经验 获得超17个赞

简单来说,在python中只有模块,类,和函数才会产生新的作用域,所以for循环里定义的变量在循环外也能访问,只要他们在同一个作用域里

查看完整回答
反对 回复 2019-03-04
  • 4 回答
  • 0 关注
  • 918 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信