为什么g在这个if条件下会给我错误?

2024-05-02 11:05:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用以下代码打印素数:

import math    

b=[]
for num in range(2,1000):
    if num>1:
        if all(num%g!=0 for g in range(2,int(math.sqrt(num))+1)):
            print(g)
            b.append(num)
print(b)

我的问题是,当我试图打印g时,为什么会出现错误NameError: name 'g' is not defined。为什么我不能打印g?你知道吗


Tags: 代码inimportforif错误rangemath
2条回答

因为之后

if all(num%g!=0 for g in range(2,int(math.sqrt(num))+1)):

执行时,g已从本地框架。它未定义为局部变量。您可以将上述代码重写为for循环并在其中打印g,应该清楚为什么不能调用print(g):

indicator = True;
for g in range(2,int(math.sqrt(num))+1):
    if num%g == 0:
        indicator = False
    #u can print g here
#outside of for loop, g is no longer in the local frame, it is now undefined
if indicator:
    b.append(num)

尝试print(g)时遇到的问题是生成器表达式的作用域规则。Python 2和Python 3在变量/名称的作用域和生存期方面存在差异:

Python2

In [1]: list((a for a in range(5))); print a
                                     -
NameError                                 Traceback (most recent call last)
<ipython-input-1-eb5a741c3a99> in <module>()
  > 1 list((a for a in range(5))); print a

NameError: name 'a' is not defined

In [2]: list([b for b in range(5)]); print b
4

在python2中,list comprehensions将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值后可以访问这些名称,并将打印最后一个值。与此相反,生成器表达式不会将其名称“泄漏”到封闭范围。你知道吗

Python3

In [1]: list((a for a in range(5))); print(a)                                   
                                     -
NameError                                 Traceback (most recent call last)
<ipython-input-1-b1aaa69684c6> in <module>
  > 1 list((a for a in range(5))); print(a)

NameError: name 'a' is not defined

In [2]: list([b for b in range(5)]); print(b)                                   
                                     -
NameError                                 Traceback (most recent call last)
<ipython-input-2-75ef5b1fd39f> in <module>
  > 1 list([b for b in range(5)]); print(b)

NameError: name 'b' is not defined

在Python3中,列表理解和生成器表达式都不会将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值之后,名称是未定义的。你知道吗

你的案子

因此,无论使用哪种版本的Python,都将无法访问变量g。如果要查看g的所有值,可以使用以下命令:

import math

def printret(x):
    print(x)
    return x

b=[]
for num in range(2,1000):
    if num>1:
        if all(num%printret(g)!=0 for g in range(2,int(math.sqrt(num))+1)):
            b.append(num)
print(b)

另一方面,您知道g的最后一个值将是int(math.sqrt(num)),因此您可以打印:

import math

b=[]
for num in range(2,1000):
    if num>1:
        if all(num%g!=0 for g in range(2,int(math.sqrt(num))+1)):
            print(int(math.sqrt(num)))
            b.append(num)
print(b)

相关问题 更多 >