首页 文章

在Python 'for'循环中确定范围

提问于
浏览
132

我'm not asking about Python'的范围规则;我一般都了解Python for循环中的作用域是如何工作的 . 我的问题是为什么设计决策是以这种方式做出的 . 例如(没有双关语):

for foo in xrange(10):
    bar = 2
print(foo, bar)

以上将打印(9,2) .

这让我感到很奇怪:'foo'实际上只是控制循环,而'bar'是在循环中定义的 . 我可以理解为什么'bar'可能需要在循环外部访问(否则,for循环将具有非常有限的功能) . 我不明白为什么在循环退出后控制变量必须保持在范围内 . 根据我的经验,它只会使全局命名空间变得混乱,并且更难以追踪其他语言中的解释器会捕获的错误 .

6 回答

  • 1

    最有可能的答案是,它只是保持语法简单,并不是采用的绊脚石,许多人都乐于在循环结构中分配名称时不必消除名称所属的范围 . 变量不在范围内声明,它由赋值语句的位置隐含 . global 关键字仅因此而存在(表示分配在全局范围内完成) .

    Update

    以下是关于该主题的很好的讨论:http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

    以前提出的循环变量局部循环变量的建议偶然发现现有代码的问题依赖于循环变量在退出循环后保持其值,并且似乎这被认为是一个理想的特性 .

    简而言之,您可能会将其归咎于Python社区:P

  • 1

    Python没有块,就像其他一些语言(如C / C或Java)一样 . 因此,Python中的作用域单元是一个函数 .

  • 81

    一个非常有用的情况是使用 enumerate 并且你想要最终的总计数:

    for count, x in enumerate(someiterator):
        dosomething(count, x)
    print "I did something {0} times".format(count)
    

    这有必要吗?不,但是,它确实很方便 .

    另一件需要注意的事情是:在Python 2中,列表推导中的变量也被泄露:

    >>> [x**2 for x in range(10)]
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> x
    9
    

    但是,同样不适用于Python 3 .

  • 49

    Python的主要影响之一是ABC,这是荷兰开发的一种语言,用于向初学者教授编程概念 . Python的创建者Guido van Rossum在20世纪80年代在ABC工作了几年 . 我对ABC几乎一无所知,但是因为它适用于初学者,我认为它必须具有有限数量的范围,就像早期的BASIC一样 .

  • -1

    如果你在循环中有一个break语句(并希望稍后使用迭代值,也许是为了选择备份,索引或给出状态),它会为你节省一行代码和一个赋值,这样就方便了 .

  • 32

    对于初学者来说,如果变量是循环的局部变量,那么这些循环对于大多数真实世界的编程来说都是无用的 .

    在目前的情况:

    # Sum the values 0..9
    total = 0
    for foo in xrange(10):
        total = total + foo
    print total
    

    产量 45 . 现在,考虑一下赋值如何在Python中工作 . 如果循环变量是严格本地的:

    # Sum the values 0..9?
    total = 0
    for foo in xrange(10):
        # Create a new integer object with value "total + foo" and bind it to a new
        # loop-local variable named "total".
        total = total + foo
    print total
    

    产生 0 ,因为分配后循环内的 total 与循环外的 total 变量不同 . 这不是最佳或预期的行为 .

相关问题