@sergeevif

Обращение к глобальной переменной из цикла?

Друзья помогите, пожалуйста

В начале кода:

timeslots = [
    [(' 12:00-13:00', 'белый')],
    [(' 13:00-14:00', 'белый')],
    [(' 14:00-15:00', 'белый')],
    [(' 15:00-16:00', 'белый')],
    [(' 16:00-17:00', 'белый')],
    [(' 17:00-18:00', 'белый')],
    [(' 18:00-19:00', 'белый')],
    [(' 19:00-20:00', 'белый')],
    [(' 20:00-21:00', 'белый')],
    [('↩ Назад', 'красный')],
]

global unavailable_timeslots 
unavailable_timeslots = []
available_timeslots = []

def select_timeslot(timeslots, unavailable_timeslots):
    available_timeslots = []
    for timeslot in timeslots:
        if timeslot in unavailable_timeslots:
            pass
        else:
            available_timeslots.append(timeslot)
    return available_timeslots


Затем есть основной цикл, где идет проверка В этом цикле при выбор определенного времени идет код, который добавляет в список:

Абстрактно:

while True:
    if msg == " 12:00-13:00":
        unavailable_timeslots.append([(' 12:00-13:00', 'белый')])


И по идее, при дальнейшем выводе тайм-слотов это время не выводится. Но я так понял, что unavailable_timeslots добавляется внутри цикла, не влияя на глобальный список, который за циклом

Заранее спасибо за ответ!
  • Вопрос задан
  • 223 просмотра
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix Куратор тега Python
yellow
И по идее, при дальнейшем выводе тайм-слотов это время не выводится

По идее, или не выводится?
Все должно работать, если список был объявлен где-то вне функции, он спокойно модифицируется внутри функции без всяких глобалов.
Ответ написан
solotony
@solotony
покоряю пик Балмера
не совсем понятен твой вопрос

предполагаю что global использован неправильно

в питоне имя объявляется в момент присваивания

global unavailable_timeslots - указание на то что unavailable_timeslotsнадо искать в глобальной области, но так он и так там . т.е. global ты используешь непрравильно

если внутри функции ты обращаешься (получаешь значение) к переменной то питон ее ищет во всех областях . - и у темя найдет только в глобальной

если внутри функции ты присваиваешь значение - вот тогда будет играть роль global

вот посмотри пример:

a = 0
b = 1
def x():
...     global b
...     print(a)
...     print(b)
...     a = 22
...     b = 33
...     print(a)
...     print(b)
...     
x()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 3, in x
UnboundLocalError: local variable 'a' referenced before assignment
def y():
...     global b
...     print(a)
...     print(b)
...     b = 33
...     print(a)
...     print(b)
...     
y()
0
1
0
33
x()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 3, in x
UnboundLocalError: local variable 'a' referenced before assignment

def z():
...     global b
...     a = 7
...     print(a)
...     print(b)
...     a = 22
...     b = 33
...     print(a)
...     print(b)
... 
z()
7
33
22
33
print(a)
0
print(b)
33


y() и z() без проблем отрабатываются, в то время как x() вылетает с ошибкой "UnboundLocalError: local variable 'a' referenced before assignment"

если непонятно - есть функция id()

def q():
...     global a
...     a = 1
...     print(1, id(a), a)
...     def w():
...         a = 2
...         print(2, id(a), a)
...     print(3, id(a), a)
...     w()
...     print(4, id(a), a)
... a = 3
... print(5, id(a), a)
5 140703280161488 3
q()
1 140703280161424 1
3 140703280161424 1
2 140703280161456 2
4 140703280161424 1
print(5, id(a), a)
5 140703280161424 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы