2012-08-10 64 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