【问题标题】:Python scoping rules in nested for loops嵌套 for 循环中的 Python 范围规则
【发布时间】:2017-07-29 17:07:50
【问题描述】:

这是确定列表中的数字是否为素数的代码(python2):

这有效 (1):

    L = [4 , 9, 13, 15, 16]

    def primenumber4():
        for i in L:
            compositenumber = False
            for x in range(2,i):
                if i%x == 0:
                    compositenumber = True              
                    break
            if compositenumber:
                print "%s is not a prime number" % i        
            else:   
                print "%s IS a prime number" % i

    primenumber4()

但这不是(2):

    L = [4 , 9, 13, 15, 16]

    def primenumber4():
        compositenumber = False
        for i in L:
            for x in range(2,i):
               if i%x == 0:
                   compositenumber = True               
                   break
            if compositenumber:
                print "%s is not a prime number" % i        
            else:   
                print "%s IS a prime number" % i

    primenumber4()

它给出的数字 13 不是素数。

但是为什么呢?

根据这个步骤: Short Description of the Scoping Rules?

Antti Haapala 的回答中“对许多 Python 新手来说最大的惊喜之一是 for 循环不会创建变量范围”

所以我想象值“泄漏”到函数范围内: 单个 for 循环就是这种情况 示例:

    def function():
        i = 9
        k = False
        for x in range(2, 9):
            if i%x == 0:
                k = True                
                break

        print k

打印 k = True 所以变量改变了

所以我的问题是:为什么 (2) 中的变量“复合数”没有变化? 如果 for 循环没有范围,为什么该变量不是函数中的局部变量?为什么它不会“通过两次 for 循环泄漏”并最终成为函数 def 中的局部变量。

我正在尝试理解 python 范围规则,因为我认为我没有完全理解它。提前致谢!

【问题讨论】:

    标签: python-2.7 scope


    【解决方案1】:

    这不是范围问题。问题是当您在for 循环内分配primenumber = False 时,该分配发生每次您通过循环。它每次都将值重置为False

    当您在循环上方分配primenumber = False 时,它只会以这种方式分配一次,因此primenumber 在第一次设置为True 后仍然是True

    另外,primenumber 是一个糟糕的名称,用于指示数字是否为复合数的变量。

    【讨论】:

    • 哈哈,我很快就编辑了。写这个的时候,我似乎有点困惑。谢谢!简单的答案。我觉得自己没有看到自己很愚蠢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2015-08-15
    • 2022-12-16
    相关资源
    最近更新 更多