<p>尝试<code>print(g)</code>时遇到的问题是生成器表达式的作用域规则。Python 2和Python 3在变量/名称的作用域和生存期方面存在差异:</p>
<h2>Python2</h2>
<pre><code>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
</code></pre>
<p>在python2中,list comprehensions将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值后可以访问这些名称,并将打印最后一个值。与此相反,生成器表达式不会将其名称“泄漏”到封闭范围。你知道吗</p>
<h2>Python3</h2>
<pre><code>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
</code></pre>
<p>在Python3中,列表理解和生成器表达式都不会将表达式中使用的名称“泄漏”到封闭范围,即在对表达式求值之后,名称是未定义的。你知道吗</p>
<h2>你的案子</h2>
<p>因此,无论使用哪种版本的Python,都将无法访问变量<code>g</code>。如果要查看<code>g</code>的所有值,可以使用以下命令:</p>
<pre><code>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)
</code></pre>
<p>另一方面,您知道<code>g</code>的最后一个值将是<code>int(math.sqrt(num))</code>,因此您可以打印:</p>
<pre><code>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)
</code></pre>