посилання перед помилкою призначення в python


77

У Python я отримую таку помилку:

UnboundLocalError: local variable 'total' referenced before assignment

На початку файлу (до функції, звідки походить помилка), я оголошую "total", використовуючи глобальне ключове слово. Потім, у тілі програми, перед викликом функції, яка використовує 'total', я присвоюю їй 0. Я намагався встановити її в 0 в різних місцях (включаючи верхню частину файлу, відразу після оголошення ), але я не можу змусити його працювати. Хтось бачить, що я роблю не так?


4
Ви оголошуєте глобальну функцію?
Nikhil Chelliah

Відповіді:


154

Я думаю, ви неправильно використовуєте "глобальний". Див. Посилання на Python . Вам слід оголосити змінну без глобальної, а потім усередині функції, коли ви хочете отримати доступ до глобальної змінної, ви оголосите її global yourvar.

#!/usr/bin/python

total

def checkTotal():
    global total
    total = 0

Дивіться цей приклад:

#!/usr/bin/env python

total = 0

def doA():
    # not accessing global total
    total = 10

def doB():
    global total
    total = total + 1

def checkTotal():
    # global total - not required as global is required
    # only for assignment - thanks for comment Greg
    print total

def main():
    doA()
    doB()
    checkTotal()

if __name__ == '__main__':
    main()

Оскільки doA()не змінює загальну загальну сукупність, результат 1, а не 11.


29
Можливо, нічого не варте того, що вам потрібно лише ключове слово "global", якщо ви призначаєте глобальну змінну в межах локальної області. Отже, у вашому прикладі глобальна декларація не потрібна в checkTotal ().
Грег Хьюгілл,

1
Вичерпна відповідь та обґрунтований аналіз основного непорозуміння, що стоїть за цим запитанням.
Джаррет Харді

3
Я мав на увазі, що, можливо, варто зазначити ! Досі не можна редагувати коментарі без видалення-прочитаного. :(
Грег Хьюгілл,

при оголошенні глобальної змінної я повинен був призначити їй значення (я зробив glob_val=None, IOW, я не зміг оголосити це без присвоєння значення
амфібієнт

6

Мій сценарій

def example():
    cl = [0, 1]
    def inner():
        #cl = [1, 2] # access this way will throw `reference before assignment`
        cl[0] = 1 
        cl[1] = 2   # these won't

    inner()

0
def inside():
   global var
   var = 'info'
inside()
print(var)

>>>'info'

проблема закінчилася


2
Було б корисно пояснити, як працює ваш код, простим поясненням або коментарем
Anurag AS

Здається, прийнята відповідь охопила використання globalвже.
Calculuswhiz

-1

Я знайшов цю публікацію через те, що сам мав цю помилку у власному коді, і я знаю, що минув деякий час з моменту публікації, і ви вже отримали відповіді та виправили проблему для цієї ситуації, але просто хотіли пояснити, як я виправив це на випадок, якщо це може допомогти комусь іншому !! В основному спочатку я думав, що редактор коду, який використовував REPL.it, робив щось для подруги і знав, що їй не захочеться завантажувати як редактор коду, справа в тому, що я думав, що це не могло t обробляти код, оскільки складність на той момент становила 139, а згодом ще більше зросла, але потім я почав експериментувати і зрозумів, що в моєму наборі функцій, що знаходиться за межами справжнього циклу в моїй функції a_loop, для того, щоб цей лист реєстрував, його потрібно було це! Отже, в основному я не був t визначення значення в цьому випадку функції підрахунку, фактично в коді! Я б поділився тут своїм кодом, але він є певним чином особистим, як у заявах для друку, а також довжиною 2349 рядків, і так чи інакше, сподіваюся, це допоможе! Також рекомендую скористатися, якщо ви можете, у моєму випадку, деякий з коду, який я міг би, застосувавши його до більшої кількості сценаріїв, якщо зможете, щоб полегшити роботу мозку! Ще раз сподіваюся, що це допоможе, якщо у вас виникнуть запитання, будь ласка, не соромтеся запитувати, і я відповім у міру своїх можливостей! Сподіваюсь це допомагає !!! втілюючи це в життя більше сценаріїв, якщо ви можете, щоб полегшити роботу мозку! Ще раз сподіваюся, що це допоможе, якщо у вас виникнуть запитання, будь ласка, не соромтеся запитувати, і я відповім у міру своїх можливостей! Сподіваюсь це допомагає !!! втілюючи це в життя більше сценаріїв, якщо ви можете, щоб полегшити роботу мозку! Ще раз сподіваюся, що це допоможе, якщо у вас виникнуть запитання, будь ласка, не соромтеся запитувати, і я відповім у міру своїх можливостей! Сподіваюсь це допомагає !!!

-Сам

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.