这是确定列表中的数字是否为素数的代码(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,因此变量更改。
所以我的问题是:为什么变量"compositenumber“在(2)中没有变化?如果for循环没有作用域,为什么变量不是函数中的局部变量?为什么它不“两次通过两个for循环”并在函数def中作为局部变量结束。
我试图理解python作用域规则,因为我认为我没有完全理解它。提前感谢!
发布于 2017-03-08 22:29:58
这不是一个范围问题。问题是,当在primenumber = False循环中分配for时,每次遍历循环时都会发生这种分配。它每次都将值重置为False。
当您在循环上面分配primenumber = False时,它只以这种方式分配一次,所以primenumber在第一次设置为True之后仍然是True。
此外,primenumber是一个糟糕的变量名称,它指示一个数字是否是复合的。
https://stackoverflow.com/questions/42683071
复制相似问题