嵌套for循环中的Python作用域规则

时间:2017-03-08 22:24:58

标签: python-2.7 scope

这是一个代码,用于确定列表中的数字是否为素数(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?

“很多新手对Python的惊喜之一是for循环不会创建一个变量范围”,这是Antti Haapala的回答

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

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

        print k

打印k = True,因此变量

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

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

1 个答案:

答案 0 :(得分:0)

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

当您在循环上方指定primenumber = False时,它只会被分配一次,因此primenumber在第一次设置为{{1}后仍为True }。

此外,True是变量的可怕名称,表示数字是否是复合变量。