在python中的赋值错误之前引用的变量[重复]

Posted

技术标签:

【中文标题】在python中的赋值错误之前引用的变量[重复]【英文标题】:variable referenced before assignment error in python [duplicate] 【发布时间】:2019-09-14 23:23:16 【问题描述】:

在我的代码中,我正在测试用户是否拥有 AWS 访问密钥:

for response in paginator.paginate(UserName=user_name):
    if len(response['AccessKeyMetadata']) and 'AccessKeyId' in response['AccessKeyMetadata'][0].keys():
        key1 = response['AccessKeyMetadata'][0]['AccessKeyId']

稍后在我的代码中我会测试 key1 是否存在:

if key1:
    print("\nAccess Key 1: ", key1)
else:
    print("The user does not have any keys.")

如果用户根本没有键,则函数将失败并出现以下错误:

  File ".\aws_iam_utils.py", line 1430, in rotate_access_keys
    if key1:
UnboundLocalError: local variable 'key1' referenced before assignment

我是否在测试 key1 是否正确存在?为什么我得到一个未绑定的本地错误,而它应该只打印出 else 子句中的语句?

【问题讨论】:

minimal reproducible example。这是在不同的功能中吗? 不,这个错误发生在一个函数中。 对于if key:,您不会询问变量key1 是否存在。您假设变量存在并询问它是否具有 truthy 值。 【参考方案1】:

您正在体验Nonenullundefined 之间的区别。考虑三个卫生纸架。一个有很多,一个是内部纸板管,一个甚至没有管。或者换一种说法,一个有int论文,一个有None论文,一个是nullundefined

如另一个答案中所述,在您的 if 语句之前将 key1 初始化为 None 以修复它。

key1 = None

检查变量是否存在:

if 'key1' in globals():
    print(key1) # Or whatever

【讨论】:

【参考方案2】:

您只需要在if 条件之前初始化key1,即

key1 = None  # <- You need this line
for response in paginator.paginate(UserName=user_name):
    if len(response['AccessKeyMetadata']) and 'AccessKeyId' in response['AccessKeyMetadata'][0].keys():
        key1 = response['AccessKeyMetadata'][0]['AccessKeyId']

这是因为如果 if 条件不满足,key1 将不会在您的原始代码中创建。

【讨论】:

好的,谢谢。是否可以测试变量是否存在?我该怎么做?【参考方案3】:

if key1: 不测试key1 是否存在;它测试它是否包含“真实”值,并假设它确实存在。

【讨论】:

好的,谢谢。如何测试变量是否存在? 你最好不要。使其存在并将其设置为 None 之类的值。 @bluethundr 您使用此答案***.com/a/843293/10553976 中的成语检查是否存在,我会将其添加到我的答案中

以上是关于在python中的赋值错误之前引用的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的变量引用对象需注意的几点

理解python变量赋值[重复]

在赋值之前可能会引用局部变量 - Python

Python中的赋值浅拷贝深拷贝

Python基础之变量进阶

变量进阶