如何测试我在内部块中声明的变量是否存在于外部块中?

时间:2011-02-13 18:55:13

标签: python

鉴于此示例Python代码:

for item in items:
    if somecondition(item):
        requireditem = item
        break

# use item

如何知道循环后我是否可以访问requireditem?即如果somecondition(item)对于列表中的某个项目Truerequireditem = None for item in items: if somecondition(item): requireditem = item break if requireditem != None: # do something

一种解决方案可能是:

{{1}}

但我想知道Pythonic的做法是什么。

6 个答案:

答案 0 :(得分:5)

你在循环中做了什么吗?您是否将somevar设置为True以外的任何内容?如果没有,也许这会更好:

if any(somecondition(item) for item in items):
    # do something

不需要变量。

从你的编辑:

还有更好的方法:

required_items = [item for item in items if somecondition(item)]
if required_items:
    # do something
    # if only one required item is ever present, then maybe...
    required_item = required_items[0]

答案 1 :(得分:1)

您可以尝试这样的事情(但您的问题与变量范围更相关吗?)

somevar = [item for item in items if somecondition(item)]

if somevar:
    do something

if somevar: do something

答案 2 :(得分:0)

您所指的是“变量范围”。

这是一篇很好的文章,可以为新程序员解释。 http://www.digital-web.com/articles/variable_scope_for_new_programmers/

答案 3 :(得分:0)

如果你真的想知道是否有办法测试局部变量是否存在,你可以通过处理UnboundLocalError例外来实现:

try:
    somevar
except UnboundLocalError:
    print "Variable does not exist"
else:
    print "Variable exists"

但这当然不被认为是“pythonic”。不要那样做。可以事先将变量设置为None,也可以使用不同的方法。

一种解决方案是使用Python的for-else构造:

for item in items:
   if somecondition(item):
       break
else:
   raise NoSuitableItemFound()  # If no break occurred.

答案 4 :(得分:0)

对于编辑过的问题,您可以使用

try:
    requireditem = next(item for item in items if somecondition(item))
except StopIteration:
    # error handling, no item found
else:
    # do something with requireditem

这将仅遍历items,直到找到第一个匹配项,与使用列表推导的解决方案形成对比。

答案 5 :(得分:0)

对于代码的最小更改,只需在循环体中执行您想要执行的任何操作然后突破。你可能应该在第一场比赛中突破(除非你想要总是扫描整个列表并需要 last 项目满足你的条件)。

for item in items:
    if somecondition(item):
        # do something with item
        break

但是,有更好的方法可以做到这一点,具体取决于您想要做什么(其他人已发布此类解决方案)。