python全局名称未在类范围set / dict comprehension expression中定义

时间:2014-03-17 12:52:53

标签: python class

这是一个python bug吗?或者我对名称范围的理解是错误的?

以下示例在类范围中使用set comprehension:

#/usr/bin/env python
class Foo(object):
    xlist = 1,2,3,4,5,6,7,8
    xset = {xlist[idx] for idx in range(0, len(xlist), 2)}

此示例引发错误

Traceback (most recent call last):
  File "./scope.py", line 2, in <module>
    class Foo(object):
  File "./scope.py", line 4, in Foo
    xset = {xlist[idx] for idx in range(0, len(xlist), 2)}
  File "./scope.py", line 4, in <setcomp>
    xset = {xlist[idx] for idx in range(0, len(xlist), 2)}
NameError: global name 'xlist' is not defined

但是,以下两个代码不会引起任何异常:

#/usr/bin/env python
class Foo(object):
    xlist = 1,2,3,4,5,6,7,8
    xset = {idx for idx in range(0, len(xlist), 2)}


#/usr/bin/env python
class Foo(object):
    xlist = 1,2,3,4,5,6,7,8
    xset = [xlist[idx] for idx in range(0, len(xlist), 2)]

为什么python无法识别第一个“xlist”,而它识别出第一个例子最后一行中的第二个“xlist”?由于pythion可以识别其他两个例子中的“xlist”。甚至列表理解中的“xlist”也可以识别,但是集合理解中的“xlist”无法识别?似乎列表理解的名称范围和集合理解是不同的?

顺便说一句,我的python版本是2.7.6。

0 个答案:

没有答案