1

I am just beginning in python and I am getting the following error:

global name 'data' not defined on line# 62

Following is my code:

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)

Should I consider using instance variable instead of global. I have been mostly using Java and recently switched. Can anyone also provide some link for oops concepts in python.

voithos
70.9k12 gold badges107 silver badges121 bronze badges
asked Feb 11, 2014 at 22:00
2
  • I hope you put data at class level because it looked like the Java syntax for an instance field, and not because you would have used a static field in Java. Commented Feb 11, 2014 at 22:04
  • 1
    Once you fix that error, you'll have problems with __siftup() and __siftdown() as well. Commented Feb 11, 2014 at 22:04

3 Answers 3

4

When you write:

class MyClass(object):
 data = []

data becomes neither an instance variance for objects made via that class, nor a global variable in the module scope, but a class-level (static) variable.

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

This is generally not what you want.

The proper way to create instance variables is to assign them in your __init__ constructor.

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

Then, in your other methods, you can reference data as self.data instead of trying to use the global statement. In fact, try to avoid using globals in general.

answered Feb 11, 2014 at 22:05
Sign up to request clarification or add additional context in comments.

Comments

1

Use the instance varible Luke.

answered Feb 11, 2014 at 22:04

Comments

0

Perhaps you find this helpfull. Especially the LGB-Part and the following chapters.

These two little examples always helped me to clear my confusion.

#!/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)

With the result:

18 18
21 21
[Finished in 0.1s]

And the second one:

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()

With the result:

1
2
2
[Finished in 0.3s]
answered Feb 11, 2014 at 22:15

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.