python中的全局变量出错

时间:2014-02-11 22:00:07

标签: python

我刚刚开始使用python,我收到以下错误:

global name 'data' not defined on line# 62

以下是我的代码:

class PriorityQueue(object):
    """
    Max PriorityQueue
    Binary heap based implementation
    """
    data = []

    def __init__(self):
        pass

    def insert(self,d):
        global data
        data.append(d)
        __siftup()

    def extractMax(self):
        global data
        max = -1

        if not len(data) == 0:
            max = data[0]

        __siftdown()
        return max

    def __siftup():
        global data
        index = len(data) - 1
        pIndex = (index - 1)/2

        while pIndex > 0 and data[pIndex] > data[index]:
            data[pIndex], data[index] = data[index], data[pIndex]
            index = pIndex
            pIndex = (index - 1)/2

    def __siftdown():
        global data
        data[0] = data.pop()
        index = 0

        while index *2 <= len(data) -1:
            minIndex = __getMinIndex(index)
            if data[minIndex] > data[index]:
                data[minIndex], data[index] = data[index], data[minIndex]
                index = minIndex
            else:
                break

    def __getMinIndex(i):
        global data
        lIndex = i*2 +1
        rIndex = lIndex + 1

        if rIndex >= len(data) or data[lIndex] > data[rIndex]:
            return lIndex
        else:
            return rIndex

    """Test Script"""

    q = PriorityQueue()
    q.insert(3)

我应该考虑使用实例变量而不是全局变量。我一直主要使用Java,最近切换。任何人都可以在python中为oops概念提供一些链接。

3 个答案:

答案 0 :(得分:4)

当你写:

class MyClass(object):
    data = []

data既不是通过该类创建的对象的实例方差,也不是模块范围中的全局变量,而是类级(静态)变量。

>> instance = MyClass()
>> instance.data
[]
>> instance.data.append(1)
>> instance.data
[1]
>> other_instance = MyClass()
>> other_instance.data
[1]

这通常不是你想要的。

创建实例变量的正确方法是在__init__构造函数中分配它们。

class PriorityQueue(object):    
    def __init__(self):
        self.data = []

然后,在您的其他方法中,您可以将数据引用为self.data,而不是尝试使用global语句。实际上,尽量避免使用全局变量。

答案 1 :(得分:1)

使用instance varible Luke。

答案 2 :(得分:0)

也许您会发现this有帮助。特别是LGB-Part和以下章节。

这两个小例总是帮助我清除了我的困惑。

#!/usr/bin/python
# -*- coding: utf-8 -*-

class A(object):
    def __init__(self, a):
        self.a = a

    def f(self, v):
        return self.a + v

class B(A):
    def __init__(self, a, b):
        A.__init__(self,a)
        self.b = b

    def f(self, v):
        return A.f(self,v)*self.b

if __name__ == '__main__':
    b = B(2,3)
    print "18",b.f(4)
    b.a = 3
    print "21",b.f(4)

结果:

18 18
21 21
[Finished in 0.1s]

第二个:

n = 1

def A():
   n = 2
   def B():
       print n
   B()

def func1():
    n = 2
    print n

def func2():
    global n
    n = 2
    print n


if __name__ == '__main__':
    func1()
    func2()
    A()

结果:

1
2
2
[Finished in 0.3s]