2015-01-01 25 views
0

出於好奇,我想看看會與範圍在Python for循環:爲什麼指數下降

x=4 
y=3 
for y in xrange(0,y): 
    print "Y---",y 
    print "X---",x 
    for x in xrange(0,x): 
     print "x",x 

發生什麼,這個打印出

Y--- 0 
X--- 4 

x 0 
x 1 
x 2 
x 3 

Y--- 1 
X--- 3 

x 0 
x 1 
x 2 

Y--- 2 
X--- 2 

x 0 
x 1 

Ÿ如預期進展,但X降低 - 是什麼導致這種情況發生?

回答

0

不像一些其他語言,Python的循環不會引入新的範圍。這意味着使用x作爲循環變量不會像你期望的那樣影響全局x,而是會被重新分配。你可以在循環之後通過做print x來看到它 - 它不會恢復到它的preloop值,但保留它在最後一次迭代時的值。這也將是它在外循環的下一次迭代中保持的值。通過使用在循環之前不存在的循環變量,您可以更清楚地看到相同的事情:如果循環創建了一個新的作用域,試圖打印該變量將是一個NameError,但事實並非如此。

1

您的變量x = 4引用了第二個for循環中的x變量,即for x in xrange(0,x):,它們都在模塊級範圍內。所以在內部循環的每次迭代之後,x都被賦予一個新的值。

例如:

>>> x = 4 
>>> for x in xrange(0, 2): 
...  print x 
... 
0 
1 
>>> x 
1 
4

你的內環重新定義x,所以每個外循環導致它使用最後,新的較小的值用於x。這使得內部循環每次更短。

1

這是因爲你使用x同時輸入的範圍內進行遍歷,併爲循環的實際計數器。 x保留了作爲內部循環的一部分給予它的最後一個值,而xrange的本質是x-1。

要看看會發生什麼,請嘗試:

x = 10 
for x in xrange(5): 
    print x 
print x 

最終輸出是4,因爲這是X了,作爲循環的一部分的最後一個值。

如果不希望這種行爲,使用另一個變量作爲櫃檯內循環。即

x=4 
y=3 
for y in xrange(0,y): 
    print "Y---",y 
    print "X---",x 
    for z in xrange(0,x): 
     print "x",z