Python编程帮助

时间:2009-11-20 09:19:30

标签: python

#!/usr/bin/env python
import math



def primeTest(isPrime):
print('    {0}=testnum'.format(testnum))
if testnum%2 == 0 and testnum != 2: #if divisible by 2 and not 2
    isPrime = False
    print('{0} a'.format(isPrime))
    print('a')  
else:
    numroot = round(math.sqrt(testnum))
    i = 2
    while i <= numroot:
        if testnum%i == 0:
            isPrime = False
        i+=1
    print('b')


global testnum
global isPrime
testnum=2
numPrimesSoFar=0
reqPrimes=int(input('How many primes would you like? \n'))
while numPrimesSoFar < reqPrimes:   
isPrime=True
primeTest(isPrime)
print(isPrime)
if isPrime:
    print('    {0}'.format(isPrime))
    print('    {0}'.format(testnum))
    numPrimesSoFar+=1
testnum+=1

(抱歉格式化我不确定为什么它不正常,但假设我的标签格式正确) 现在输出:

    How many primes would you like? 
4
    2=testnum
b
True
    True
    2
    3=testnum
b
True
    True
    3
    4=testnum
False a
a
True
    True
    4
    5=testnum
b
True
    True
    5

好吧......那么为什么当我把它设置为假时isPrime仍然是真的?

编辑:好的......你们在谈论的是什么?

4 个答案:

答案 0 :(得分:3)

global isPrime需要位于您分配给isPrime的函数内。

答案 1 :(得分:2)

我认为,由于您在isPrime的定义之后声明了primeTest()全局变量,因此Python解释器将函数中的isPrime视为局部变量。

我错了..你必须从函数中声明它为global isPrime。声明顺序(函数或变量优先)无关紧要。像这样:

def primeTest():
    global isPrime
    isPrime = False

isPrime = True
print isPrime # returns True
primeTest()
print isPrime # returns False

请注意,您无法写global isPrime = False;它必须是两个陈述。

无论如何,改变那样的全局变量是相当不好的做法。 为什么不将isPrime作为参数传递给primeTest()

修改

好的,我的回答是仍然太仓促了。简单地传递isPrime作为参数不起作用,因为布尔值是不可变类型。处理当前问题的最佳方法是将isPrime作为返回值:

def primeTest(testnum):
    ... do your calculations here, set a variable ret_val to True or False ...
    return ret_val

现在你可以isPrime = primeTest(10)找出是否有任何数字。

但是,如果将函数传递给可变类型(如列表),则可以在函数内修改它。 This post covers it quite well.但你现在还不必关心它。

答案 2 :(得分:1)

global foo意味着,在这个范围内,让我说foo引用从这个范围之外可访问的foo,并在此范围关闭后持久化。这并不意味着,让所有名为foo的变量无处不在并永远引用这个foo。

这与您可能期望的不同,例如,如果您来自C / C ++背景,其中在顶层声明变量使其成为全局变量而不需要在每个范围内显式全局声明。

答案 3 :(得分:0)

虽然您已将isPrime设置为全局,但您要在primeTest函数的本地边界内修改它。因此,它不会被修改。

如果您需要更改,请尝试将其作为参数传递并以此方式进行修改。