【问题标题】:Puzzled about variable scope in for-loop对 for 循环中的变量范围感到困惑
【发布时间】:2020-08-02 14:24:37
【问题描述】:

此代码将引发NameError: name 'i' is not defined:

for n in range(2, 101):
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

此代码将正常执行:

n = 97
if True:
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

谁能告诉我为什么?

【问题讨论】:

    标签: python scope


    【解决方案1】:

    n 为2 时,range(2,n) 将是一个空列表,因此该循环的主体根本不会执行。

    【讨论】:

      【解决方案2】:

      这与作用域无关,实际上python中的for循环不会创建自己的作用域,除非它位于list comprehension中。您收到错误的原因是 i 没有在第一个代码中创建。

      for n in range(2,101):
      # at first iteration n == 2
          for i in range(2,n):
          # this is equivalent to range(2,2) in first iteration
      

      因此,没有可迭代的内容,因此没有为 i 分配任何值。当它转到n % i 时,它会抛出NameError

      在第二块:

      for i in range(2, n):
      # value if i is 2
      

      由于i 有一个值,因此定义,它不会抛出NameError

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-13
        • 1970-01-01
        • 2016-07-13
        • 2017-05-03
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        相关资源
        最近更新 更多