recherche

Maison  >  Questions et réponses  >  le corps du texte

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...

怪我咯怪我咯2805 Il y a quelques jours1428

répondre à tous(4)je répondrai

  • 伊谢尔伦

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

    C'est un peu comme var en javascript
    en js

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

    Étant donné que la portée de la variable définie par var dans js est la fonction entière, un let est ajouté à la syntaxe ES6. La variable définie par let est la portée au niveau du bloc
    If. c'est for(let i = 0; i < 100; i++), si vous vous connectez plus tard, ce sera undefined

    Si c'est Java, c'est aussi une portée au niveau du bloc

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

    Votre code est comme Java

    répondre
    0
  • 怪我咯

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

    Vous le remplacez par ceci et imprimez la fonction locals()

    def find(sequence, target):
        for index, value in enumerate(sequence):
            if value == target:
                break
        else:
            return -1
        print(locals())
        return index
        
    

    trouvera la sortie

    {'index': 1, 'target': 1, 'value': 1, 'sequence': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}

    Vous pouvez voir sur le résultat que l'index, la valeur, la cible et la séquence sont dans le même espace de noms. Parce qu'ils ont tous les deux la même fonction. Vous pouvez donc accéder à l'index.

    Portée de Python

    1. Rechercher dans la couche la plus interne, généralement dans une fonction, locals()

    2. Rechercher dans le module, c'est-à-dire globals()

    3. Recherchez en dehors du module, c'est-à-dire recherchez dans __builtin__

    répondre
    0
  • 高洛峰

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

    Python n'a pas de portée de bloc

    La plus petite plage est la fonction

    répondre
    0
  • PHP中文网

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

    Pour faire simple, en Python, seuls les modules, classes et fonctions créeront de nouvelles portées, donc les variables définies dans la boucle for sont également accessibles en dehors de la boucle, tant qu'elles sont dans la même portée

    répondre
    0
  • Annulerrépondre