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', на которую ссылаются перед назначением

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

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 - лучший язык программирования в мире.