2012-08-10 69 views
1

如果在一個循環中,是否有可能在循環的後續迭代中實例化要處理的對象,並且在循環的作用域已經保留時仍然可用?忘記聲明變量

這裏是什麼,我認爲可能運行的一個簡單例子:

>>> for i in range(2): 
... r = [] if r is None else r 
... r.append[i] 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'r' is not defined 

這是我的使用NameError異常第二次嘗試:

>>> for i in range(2): 
... try: 
...  r = r 
... except NameError: 
...  r = [] 
... r.append(i) 
... 
>>> 

我懷疑什麼,我一直在努力這樣做實際上是禁止的,但我不明白爲什麼會這樣。

請問有人可以爲我提供一些照明嗎?

編輯:

所以第二個方式工作,但它是非常長篇大論。有沒有快速的方法?

+0

我認識到它打敗了問題的重點,但是你當然可以在循環之前實例化它? – Ben 2012-08-10 20:08:52

+0

在你希望得到的循環之前簡單定義'r = []'有什麼好處? – DSM 2012-08-10 20:16:10

+0

@Ben和DSM,部分是第一次嘗試工作的滿足感!但也不必中止代碼輸入,因爲我忘記了定義。另外,我通常只是看看是否有用,而我似乎因爲它而重新打字。 – jon 2012-08-10 20:22:11

回答

3

你可以找到該名稱是否在您的當地人是這樣的:name in locals()關於你的問題:

>>> 'r' in locals() 
False 
>>> for i in range(2): 
    if 'r' not in locals(): r = [] 
    r.append(i) 


>>> r 
[0, 1] 
>>> 

我伊格納西奧巴斯克斯 - 艾布拉姆斯同意;這不是很好的風格。在循環之前請做你需要的。

+1

+1這是一個很好的答案。我保證不會在代碼中使用它,只有在解釋器中玩時:-) – jon 2012-08-10 20:46:36

6

這是不被禁止的,但它是積極的勸阻。 NameError應該從來沒有被禁止的極端情況;總是將名稱綁定到循環外部,即使是None也是如此。

+0

剛剛注意到我有方括號,而不是括號......修正...更新爲關注 – jon 2012-08-10 20:09:04

+0

@Jon:我的回答是立場。 – 2012-08-10 20:14:41