UnboundLocalError: локальная переменная … ссылка перед назначением

import hmac, base64, hashlib, urllib2 base = 'https://.......' def makereq(key, secret, path, data): hash_data = path + chr(0) + data secret = base64.b64decode(secret) sha512 = hashlib.sha512 hmac = str(hmac.new(secret, hash_data, sha512)) header = { 'User-Agent': 'My-First-test', 'Rest-Key': key, 'Rest-Sign': base64.b64encode(hmac), 'Accept-encoding': 'GZIP', 'Content-Type': 'application/x-www-form-urlencoded' } return urllib2.Request(base + path, data, header) 

Ошибка: Файл «C: /Python27/btctest.py», строка 8, в makereq hmac = str (hmac.new (secret, hash_data, sha512)) UnboundLocalError: локальная переменная 'hmac', на которую ссылаются перед назначением

Кто-нибудь знает, почему? благодаря

  • Отправка сообщений с помощью Telegram - API или CLI?
  • удаление каждого n-го элемента из списка в python 2.7
  • python install lxml на mac os 10.10.1
  • Оператор Star (*) применяется к спискам и целям
  • как заменить только определенные слова в файле
  • Поиск элемента с явным ожиданием с использованием selenium webdriver в python
  • Локальная переменная, заданная перед назначением в Python?
  • Python - Домашнее задание - Преобразование любой базы в любую базу
  • 2 Solutions collect form web for “UnboundLocalError: локальная переменная … ссылка перед назначением”

    Если вы назначаете переменную где угодно в функции, эта переменная будет обрабатываться как локальная переменная всюду в этой функции. Таким образом, вы увидите ту же ошибку со следующим кодом:

     foo = 2 def test(): print foo foo = 3 

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

    Чтобы исправить это, просто дайте вашей локальной переменной hmac другое имя:

     def makereq(key, secret, path, data): hash_data = path + chr(0) + data secret = base64.b64decode(secret) sha512 = hashlib.sha512 my_hmac = str(hmac.new(secret, hash_data, sha512)) header = { 'User-Agent': 'My-First-test', 'Rest-Key': key, 'Rest-Sign': base64.b64encode(my_hmac), 'Accept-encoding': 'GZIP', 'Content-Type': 'application/x-www-form-urlencoded' } return urllib2.Request(base + path, data, header) 

    Обратите внимание, что это поведение можно изменить, используя global или nonlocal ключевые слова, но похоже, что вы не захотите использовать их в своем случае.

    Вы переопределяете переменную hmac пределах области действия, поэтому глобальная переменная из оператора import отсутствует в пределах области функции. Переименование переменной hmac функции-области должно устранить вашу проблему.

    Python - лучший язык программирования в мире.