关于python:UnboundLocalError:在赋值之前引用的局部变量….

UnboundLocalError: local variable … referenced before assignment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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/bctest.py",第8行,在makereq中hmac=str(hmac.new(secret,hash_data,sha512))。UnboundLocalError:分配前引用了局部变量"hmac"

有人知道为什么?谢谢


如果在函数的任何位置指定变量,则该变量在该函数的任何位置都将被视为局部变量。因此,您将看到以下代码中的相同错误:

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

换句话说,如果同名函数中存在局部变量,则无法访问全局变量或外部变量。

要解决这个问题,只需给局部变量hmac取一个不同的名称:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

注意,这种行为可以通过使用globalnonlocal关键字来更改,但您似乎不希望在您的案例中使用这些关键字。


您正在重新定义函数范围内的hmac变量,因此import语句中的全局变量不在函数范围内。重命名函数范围hmac变量可以解决您的问题。