2015-04-23 26 views
5

अजगर निम्नलिखित स्निपेट पर विचार करें:लूप के लिए पायथन - यह अनंत लूप क्यों नहीं है?

x = 14 
for k in range(x): 
    x += 1 

निष्पादन के अंत में, x 28.

मेरा प्रश्न के बराबर है: नहीं इस कोड को पाश हमेशा के लिए होना चाहिए? प्रत्येक पुनरावृत्ति पर, यह जांचता है कि kx से कम है या नहीं। हालांकि, x लूप के भीतर बढ़ी है, इसलिए इसकी अगली तुलना के लिए उच्च मूल्य है।

+0

अजगर का कौन सा संस्करण उपयोग कर रहे हैं बनाने के लिए पाश का उपयोग कर सकते हैं? – thefourtheye

उत्तर

9

range(x) "कमांड" नहीं है। यह एक बार एक श्रेणी वस्तु बनाता है, और लूप उस पर फिर से शुरू होता है। एक्स बदलना उन सभी ऑब्जेक्ट्स को नहीं बदलेगा जो इसका उपयोग कर रहे थे।

>>> x = 2 
>>> k = range(x) 
>>> list(k) 
[0, 1] 
>>> x += 1 
>>> list(k) 
[0, 1] 
6

नहीं, range(x) आइटम के साथ एक सूची प्रदान करेगा [0,1,2,3,4,5,6,7,8,9,10,11,12,13] इन आइटम हो जाएगा दोहराया। प्रत्येक बार जब लूप बॉडी का मूल्यांकन x के मान परिवर्तन का मूल्यांकन हो जाता है लेकिन यह उस सूची को प्रभावित नहीं करता है जो पहले से उत्पन्न हुआ था।

दूसरे शब्दों में संग्रह जो आप पुनरावृत्त करेंगे, केवल एक बार उत्पन्न होगा। उसके तत्वों भर में for in पुनरावृति range(x) हर यात्रा में मार डाला नहीं है, लेकिन पहली बार में, और उसके बाद:

+2

पेडेंटिक होने के लिए, यह पायथन 2 में एक सूची और पायथन 3 में 'रेंज' ऑब्जेक्ट देता है। – Blair

1

यह क्योंकि अजगर for in लूप (अन्य भाषाओं में) for की तुलना में अलग व्यवहार कर रहा है। यदि आप एक अनंत लूप चलाने के लिए कोड को बदलना चाहते हैं तो आप इसके बजाय while का उपयोग कर सकते हैं (और उस स्थिति में (x) व्यर्थ है)।

0

पायथन में for loop एक पुनरावृत्ति नहीं है, बल्कि iterable के किसी भी रूप में एक अनुक्रम/जनरेटर यानी फिर से शुरू होता है।

इसे ध्यान में रखते हुए, जब तक कि अस्थिर अनंत न हो, लूप अनंत नहीं होगा। एक sequence अनंत नहीं हो सकता है लेकिन आप संभवतः एक अनंत जनरेटर का निर्माण/उपयोग कर सकते हैं। एक संभावना itertools.count का उपयोग करना है जो निर्दिष्ट अंतराल के साथ एक निर्दिष्ट प्रारंभ से शुरू होने वाली संख्याओं का एक गैर-समापन अनुक्रम उत्पन्न करता है।

from itertools import count  | for(;;) { 
for i in count(0):     |  //An infinite block 
    #An infinite block    | } 

वैकल्पिक रूप से, आप हमेशा जबकि एक शास्त्रीय अनंत लूप

while True: 
    #An infinite block 
संबंधित मुद्दे