2016-09-30 62 views
0

名單我有一個奇怪的Python初學者的問題,一個循環的「積壓」 ..玩弄我的虛擬ENV在解釋器(Python的3.5):通過在Python

我有混合類型的列表:

lissi = ["foo", "bar". "boo", "baz", 4, 7] 

然後「不小心」嘗試打印出來的所有元素的循環串聯爲一個字符串:

for x in lissi: 
    print("Hallo " + x) 

這,當然,是不是possibl e bcs。我們無法濃縮。整數轉換爲一個字符串 - 所以第一個元素被打印,然後是TypeError。

然後,我輸入只是"x" and enter,看看是否仍然存儲數據,是的它是:x是4

type(x)int(試圖找出7是否仍然存在)。

所以我的問題是:在Python中,在for循環中發生了什麼:「看起來好像每個成功處理的元素都被刪除了,但是存在一個積壓在x中的積壓,這是TypeError被引發的第一個元素對於?有沒有辦法在出現錯誤時從存儲器中「清除」這些數據?

THX

回答

1

這不是積壓,並沒有像「每個成功處理的元素被刪除」。
基本上每次迭代for循環分配給變量x列表中下一個元素的值lissi(不一定是列表,可以是任何可迭代的)。
只要環路中斷,由於異常或break語句,變量x保持不變,因此它包含由for循環分配的最後一個值。
這是可以的,因爲循環在Python中沒有任何獨立的範圍,並且實際上可以方便地爲有趣的元素搜索iterable,當它被找到時打破循環,並且在離開循環之前不被迫將其存儲在另一個變量中。

+0

感謝您的「這是好的,因爲循環[...]」的一部分,所以我明白,我不擔心,在不太可能的情況下s.o.將循環遍歷數千個元素的混合集合,而不檢查和知道它們的類型,最終會出現內存/範圍問題:-) –

-1

我相信這個問題是不是與for環,但與print()聲明。

不能+integer,例如string

這是行不通的:

print("Hallo " + 4) 

也不會對這樣的:

print(4 + " Hallo") 

,如果它是所有整數會工作:

print(4 + 1) 

這是從print("Hallo " + 4)顯示的錯誤是「builtins.TypeError: Can't convert 'int' object to str implicitly

的解決方案是從整數做轉換爲字符串明確地:現在

for x in lissi: 
    print("Hallo " + str(x)) 

,對於你的問題,我不相信有作爲「後退日誌」的東西。的for x in lissi枚舉仍然有效,並x仍然有效,只是在處理第4個枚舉(其中xstring)的print()語句將工作,那麼它拋出的print()語句中的錯誤,但x仍然是一個有效的integer

+3

OP知道'TypeError'的原因,但想知道'for'循環是如何工作的。 – ElmoVanKielmo

+0

編輯答案,x在for循環中始終有效。 –

+1

@EdwinvanMierlo那也不是重點。 OP想知道爲什麼在for循環中'x'的值在異常之後被記住。 – Aaron3468

2

for循環聲明它的範圍的一部分,所以下面的代碼將改變x值:

x = 9 

for x in xrange(3): # iterate 0, 1, 2 
    print(x) 

print(x) # x == 2, x != 9 

當元素是"baz",一切都很好,而且打印語句工作。然後Python繼續執行。下一步是x = 4。之後,print "Hallo" + x失敗並顯示錯誤。

運行解釋器時,會捕獲並打印錯誤,然後執行繼續執行。解釋器發生錯誤後沒有清理,所以當您檢查該值時,最後一個值x仍然存在。這就是爲什麼你看到4.