2016-10-08 294 views
1

Most arguments爲什麼被做了設計決策,使for循環變量本地環路以外表明,有流行的用例。安全使用循環變量循環

明顯的使用情況是這樣的:

x = default_value 
for x in iterator: 
    # do stuff 
# do something with x here 

遺憾的是,往往第一行遺忘:

# should have set default value for x here 
# but forgot 
for x in iterator: 
    # do stuff 
# do something with x here 

所以當迭代器是空的,他們提出NameError如果x前面沒有定義。

這個錯誤得到與嵌套循環惡化:

for y in outer_iterator: 
    # should have set default value for x here 
    # but forgot 
    for x in inner_iterator(y): 
     # do stuff 
    # do something with x 

這裏忘記了x = default_value導致無聲的錯誤,而不是一個異常,如果inner_iterator(y)是通過外循環的第二或後面的迭代空。

測試這些情況很困難,因爲inner_iterator(y)不是一個外部參數,所以除非測試足夠幸運地以某種方式重新創建情況,否則該錯誤將不會被檢測到。

所有的用例都是脆弱的還是有安全的方法來依賴for循環變量的範圍規則?

回答

0

除非可以100%確定迭代器永遠不會空,否則沒有100%的安全方法依賴於for循環中設置的變量。爲了達到100%的保證,你可以做一些類似於for x in iterator or [None]:的事情,但是這提出了類似的「記住去做」的問題。這可能比設置默認值更「pythonic」,但默認值可能會提供更多清晰度。整個依賴於for循環的範圍類似於if (condition): x = something之類的東西,然後考慮如果在條件爲假時我調用x怎麼辦?你可能不會這樣寫代碼,那麼爲什麼要這樣做for循環?我喜歡使它習慣於聲明所有將在外部使用的變量(例如,在函數的開頭將所有變量設置爲None或其他默認值),但這只是歸結於優先級。

0

我同意循環沒有自己的作用域的最明顯的原因是將外部作用域中的變量賦值時引入的複雜性。

但是,這並不一定意味着迭代的值。考慮以下幾點:

total = 0 
for item in some_list: 
    total += item 

如果循環有自己的變量範圍,實施這將是一場噩夢。

其中onsequences的是,item也avaialable圈外的,但是,這並不真正意味着有一個很好的方式(或者如你所說「安全」方式)來使用它。

你可以使用它,但你必須小心。