You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:59