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

Ant*_*ton 1 python set gevent

我正在尝试使用set():

adjacent = filter(lambda p: p[0] in xp and p[1] in yp, p_data)
adjacent = set(adjacent)
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

码:

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
Run Code Online (Sandbox Code Playgroud)

Ash*_*ary 6

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

for set in self.view_ports:
        for x, y in set:
Run Code Online (Sandbox Code Playgroud)

文档:当变量有值时,为什么我得到UnboundLocalError?

  • 由于你在函数中赋值给`set`(`for`循环是一个隐式赋值),`set`是一个隐藏内置类型`set`的局部变量.当你尝试使用`set()`来创建一个set时,它还没有被赋值,这就是你在赋值之前得到引用它的错误的原因. (2认同)