这是一个代码,用于确定列表中的数字是否为素数(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范围规则,因为我认为我没有完全理解它。提前谢谢!
答案 0 :(得分:0)
这不是范围问题。问题是,当您在primenumber = False
循环中分配for
时,每次进行循环时,该分配都会发生。它每次都会将值重置为False
。
当您在循环上方指定primenumber = False
时,它只会被分配一次,因此primenumber
在第一次设置为{{1}后仍为True
}。
此外,True
是变量的可怕名称,表示数字是否是复合变量。