Python函数返回变量异常:调用密钥生成函数后输出仍为b''
解决Python中全局变量未被函数正确修改的问题
我来帮你分析下问题所在,然后给出两种可行的解决办法。
首先,先把你的代码逻辑还原出来,大概是这样的:
import base64 from hashlib import pbkdf2_hmac import os key = b'' def encodingKey(password): # 编码密码 password_bytes = password.encode('utf-8') # 生成盐 salt = os.urandom(16) # 派生密钥 derived_key = pbkdf2_hmac('sha256', password_bytes, salt, 100000) # 编码密钥 key = base64.urlsafe_b64encode(derived_key) return key encodingKey("123456") print(key) # 输出还是 b''
问题根源
在Python中,当你在函数内部给一个变量赋值时,解释器会默认把这个变量当成局部变量,而不是去修改全局作用域里的同名变量。所以你的encodingKey函数里的key = ...其实是创建了一个函数内部的局部key,和全局的key完全是两个独立的变量——这就导致全局的key始终是初始的b''。
解决办法1:使用global关键字声明全局变量
如果你一定要修改全局的key变量,可以在函数内部用global关键字明确告诉解释器:我要操作的是全局作用域里的key,不是局部变量。修改后的代码如下:
import base64 from hashlib import pbkdf2_hmac import os key = b'' def encodingKey(password): global key # 声明要使用全局的key变量 password_bytes = password.encode('utf-8') salt = os.urandom(16) derived_key = pbkdf2_hmac('sha256', password_bytes, salt, 100000) key = base64.urlsafe_b64encode(derived_key) return key encodingKey("123456") print(key) # 现在会输出正确的派生密钥
解决办法2:直接使用函数的返回值(更推荐)
其实在Python编程中,我们通常不推荐过度依赖全局变量——它会让代码的可读性和维护性变差,还容易引发意想不到的bug。更优雅的方式是直接使用函数的返回值来获取密钥,完全不需要全局变量:
import base64 from hashlib import pbkdf2_hmac import os def encodingKey(password): password_bytes = password.encode('utf-8') salt = os.urandom(16) derived_key = pbkdf2_hmac('sha256', password_bytes, salt, 100000) return base64.urlsafe_b64encode(derived_key) # 调用函数并接收返回值 key = encodingKey("123456") print(key) # 输出正确的派生密钥
这种方式代码逻辑更清晰,也避免了全局变量带来的潜在问题,是更符合Python编程习惯的做法。
内容的提问来源于stack exchange,提问作者user12058827
相关产品推荐
相关产品推荐

