検索

ホームページ  >  に質問  >  本文

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

怪我咯怪我咯2802日前1421

全員に返信(4)返信します

  • 伊谢尔伦

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

    これは、JavaScript の var、js

    に少し似ています。 リーリー

    js で var で定義された変数のスコープは関数全体であるため、let で定義された変数は let の場合、ES6 構文に追加されます。
    です。後でログインすると、for(let i = 0; i < 100; i++)undefined になります。

    Java の場合、ブロックレベルのスコープでもあります

    リーリー

    あなたのコードは Java に似ています

    返事
    0
  • 怪我咯

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

    これをこれに変更し、locals() 関数を出力します

    リーリー

    出力が見つかります

    リーリー

    出力から、インデックス、値、ターゲット、シーケンスが同じ名前空間にあることがわかります。なぜなら、それらは両方とも同じ機能にあるからです。これでインデックスにアクセスできるようになります。

    Python のスコープ

    1. 最も内側のレベルで検索します。通常は関数 locals()

    2. 内で検索します。
    3. モジュール内を検索します。つまり、globals()

    4. モジュールの外で検索、つまり __builtin__ 内で検索

    返事
    0
  • 高洛峰

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

    Python にはブロック スコープがありません

    最小範囲は関数です

    返事
    0
  • PHP中文网

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

    簡単に言うと、Python ではモジュール、クラス、関数のみが新しいスコープを作成するため、for ループ内で定義された変数は、同じスコープ内にある限り、ループの外からもアクセスできます。

    返事
    0
  • キャンセル返事