Ошибка решения: локальная переменная ‘counter’, на которую ссылаются перед назначением

#python

#python

Вопрос:

Небольшой вопрос о глобальных значениях. У меня есть следующий код:

 counter = 0
class A():
    global counter

    def connect():
        counter  = 1
        print("Opening connection",counter)
        # DO STUFF

    def disconnect():
        counter -= 1
        print("Closing connection",counter)
        # DO STUFF
 

Каждый раз, когда я подключаюсь или отключаюсь, я хочу знать количество открытых подключений counter (не только для одного экземпляра, а для всех экземпляров, поэтому оно должно быть статическим). Но при запуске кода я получаю:

 local variable 'counter' referenced before assignment
 

Почему это так? Считайте, что A() она находится в другом файле, чем main .

Комментарии:

1. «глобальное» объявление работает только в функции / методе.

2. вам не нужно писать lobal counter в классе, но вы должны сделать это в методах

3. @Michael Butscher, я знаю, на самом деле я редактировал, я допустил ошибку при написании

Ответ №1:

Как сказано в комментариях, global объявление работает только в функции или методе.

 counter = 0
class A():
    def connect():
        global counter
        counter  = 1
        print("Opening connection",counter)
        # DO STUFF

    def disconnect():
        global counter
        counter -= 1
        print("Closing connection",counter)
        # DO STUFF
 

Комментарии:

1. Спасибо. Если у меня есть два экземпляра A() , они разделяют счетчик, верно?

2. Да. P.S — Это ограничение на количество слов в комментарии раздражает.

Ответ №2:

Вы должны сделать это:

 counter = 0
class A():

    def connect():
        global counter
        counter  = 1
        print("Opening connection",counter)
        # DO STUFF

    def disconnect():
        global counter
        counter -= 1
        print("Closing connection",counter)
        # DO STUFF
 

Ответ №3:

Вы должны переместить глобальный счетчик внутри функций.

Также, если вы используете многопоточность / многопроцессорность, вы должны использовать семафор при обновлении счетчика.