cari

Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu1423

membalas semua(4)saya akan balas

  • 伊谢尔伦

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

    Ini sedikit seperti var dalam javascript
    dalam js

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

    Oleh kerana skop pembolehubah yang ditakrifkan oleh var dalam js ialah keseluruhan fungsi, let ditambahkan pada sintaks ES6 Pembolehubah yang ditakrifkan oleh let ialah skop peringkat blok ia adalah
    , Jika anda log i kemudian, ia akan menjadi for(let i = 0; i < 100; i++)undefined

    Jika ia java, ia juga skop peringkat blok

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

    Kod anda seperti java

    balas
    0
  • 怪我咯

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

    Anda menukarnya kepada ini dan mencetak fungsi locals()

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

    akan mencari output

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

    Anda boleh melihat daripada output bahawa indeks, nilai, sasaran dan jujukan berada dalam ruang nama yang sama. Kerana kedua-duanya mempunyai fungsi yang sama. Jadi anda boleh mengakses indeks.

    Skop Python

    1. Cari di lapisan paling dalam, biasanya dalam fungsi, locals()

    2. Cari dalam modul, iaitu globals()

    3. Cari di luar modul, iaitu, cari dalam __builtin__

    balas
    0
  • 高洛峰

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

    Python tidak mempunyai skop blok

    Julat terkecil ialah fungsi

    balas
    0
  • PHP中文网

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

    Ringkasnya, dalam Python, hanya modul, kelas dan fungsi akan mencipta skop baharu, jadi pembolehubah yang ditakrifkan dalam gelung for juga boleh diakses di luar gelung, selagi ia berada dalam skop yang sama

    balas
    0
  • Batalbalas