奇怪的set()错误。赋值前引用的局部变量'set'

时间:2013-09-25 16:49:16

标签: python set gevent

我正在尝试使用set()

adjacent = filter(lambda p: p[0] in xp and p[1] in yp, p_data)
adjacent = set(adjacent)

然而,我收到此错误:

Traceback (most recent call last):
  File "/home/anarchist/Desktop/python27/lib/python2.7/site-packages/gevent/greenlet.py", line 327, in run

result = self._run(*self.args, **self.kwargs)

File "/home/anarchist/Desktop/BSpaces/BrochureSpaces/imageProcessing/__init__.py", line 60, in findViewPorts
    adjacent = set(adjacent)

UnboundLocalError: local variable 'set' referenced before assignment
<Greenlet at 0x15879b0: <bound method rawImage.findViewPorts of <BrochureSpaces.imageProcessing.rawImage instance at 0x7f7177356830>>(image_file='image_t.png')> failed with UnboundLocalError

代码:

class rawImage:
def __init__(self, **kwargs):
    logging.root.setLevel(logging.DEBUG)

    self.p_data = []    # Positions of all non opaque pixels

    gevent.spawn(self.findTransparent, **kwargs).join()
    gevent.spawn(self.findViewPorts, **kwargs).join()

def findTransparent(self, **kwargs):...

def findViewPorts(self, **kwargs):
    # Takes data and divides it into chunks that are continuous
    self.view_ports = []    # Each entry is list of (x, y)

    # Take first pixel, find all adjacent, transfer and delete
    p_data = self.p_data
    while p_data:
        xp = range(p_data[0][0] - 1, p_data[0][0] + 2)      # + 2 because of the quirks of range
        yp = range(p_data[0][1] - 1, p_data[0][1] + 2)     # Possible x, y ranges of adjacent pixels

        _temp = []
        _temp.append((p_data[0][0], p_data[0][1]))
        del p_data[0]
        print xp, yp

        adjacent = filter(lambda p: p[0] in xp and p[1] in yp, p_data)
        adjacent = set(adjacent)

        print adjacent, len(p_data)
        while adjacent:
            pixel = adjacent[0]
            print pixel, '-'
            xp = range(pixel[0] - 1, pixel[0] + 2)
            yp = range(pixel[1] - 1, pixel[1] + 2)     # Possible x, y ranges of adjacent pixels
            _temp.append((pixel[0], pixel[1]))

            try:
                print adjacent[0]
                p_data.remove(adjacent[0])
                print p_data
                del adjacent[0]
            except BaseException as e:
                logging.warning('findViewPorts %s', e)
                return
            adjacent.add(set(filter(lambda p: p[0] in xp and p[1] in yp, p_data)))

        logging.debug('findViewPorts ' + str(_temp))
        self.view_ports.append(_temp)
        break

    for set in self.view_ports:
        for x, y in set:
            print x, y

1 个答案:

答案 0 :(得分:6)

不要使用内置函数作为变量名,这会导致错误:

for set in self.view_ports:
        for x, y in set:

文档:Why am I getting an UnboundLocalError when the variable has a value?