`global` name not defined error when using class v

2019-08-02 06:44发布

问题:

For some reason I'm getting a global name is not defined error here. The issue lies in the addClient method where I am incrementing my global variable joinID. It throws me an error NameError: global name 'joinID' is not defined. What am I doing wrong?

class Chatroom:
    clients = []
    joinID = 0

    def __init__(self,name,refNum):
        self.refNum = refNum
        self.name = name

    def addClient(self,clientName):
        global clients
        global joinID
        joinID = joinID+1
        clients.append(clientName, joinID)

    def removeClient(self, clientName, joinID):
        global clients
        clients.remove(clientName, joinID)

回答1:

Take the variables outside the class

joinID=0
clients=[]
class Chatroom:
    def __init__(self,name,refNum):


回答2:

In a method from a class is bether to use a instance attribute or a class atribute. In this case you are using a class atribute.

class Chatroom:
    clients=[]
    joinID=0

    def __init__(self,name,refNum):
        self.refNum=refNum
        self.name=name

    def addClient(self,clientName):
        self.joinID=self.joinID+1
        self.clients.append((clientName,self.joinID))

    def removeClient(self,clientName,joinID):
        self.clients.remove((clientName,joinID))

If you wan´t to use global, you must declare the variable in the global scope:

joinId=0
clients=[]
class Chatroom:

    def __init__(self,name,refNum):
        self.refNum=refNum
        self.name=name

    def addClient(self,clientName):
        global joinID
        global clients
        joinID=joinID+1
        clients.append((clientName,joinID))

    def removeClient(self,clientName,joinID):
        global clients
        clients.remove((clientName,joinID))