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)
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
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
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)
因为之后
执行时,g已从本地框架。它未定义为局部变量。您可以将上述代码重写为for循环并在其中打印g,应该清楚为什么不能调用print(g):
尝试
print(g)
时遇到的问题是生成器表达式的作用域规则。Python 2和Python 3在变量/名称的作用域和生存期方面存在差异:Python2
在python2中,list comprehensions将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值后可以访问这些名称,并将打印最后一个值。与此相反,生成器表达式不会将其名称“泄漏”到封闭范围。你知道吗
Python3
在Python3中,列表理解和生成器表达式都不会将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值之后,名称是未定义的。你知道吗
你的案子
因此,无论使用哪种版本的Python,都将无法访问变量
g
。如果要查看g
的所有值,可以使用以下命令:另一方面,您知道
g
的最后一个值将是int(math.sqrt(num))
,因此您可以打印:相关问题 更多 >
编程相关推荐