未解析的引用与Python中的列表

时间:2017-08-29 19:35:26

标签: python function debugging pycharm

我不完全确定这种行为是否可以预期,但它确实很奇怪。当你有这样的代码时:

def a_function():
    if a_list != some_other_list:
        print(a_list)

它工作正常,我没有问题。但是,如果将其更改为:

def a_function():
    if a_list != some_other_list:
        a_list = some_other_list

突然发生问题,它说第2行的a_list是未解析的引用。为什么if语句中的内容会影响是否可以解析a_list?这种事情是正常的吗?它可能是Python 3.6.1或PyCharm(Community Edition 2017.1.5)中的错误吗?任何有关澄清这一点的帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

只要您只访问非函数本地的变量,只要在外部作用域的某处找到它们,一切正常。但是,只要您分配给变量,它就会变为您的函数的本地变量。 Python将不再查看变量名称的外部作用域。所以当你包括:

a_list = some_other_list

该行:

a_list != some_other_list

将失败,因为它不再在函数外部查找a_list,如果您稍后在函数中定义它,则它是UnboundLocalError或类似的。

如果您有兴趣,我会在另一个answer中详细了解。

如果您只是想将等级更改=(赋值)与==(等式检查)进行比较。

答案 1 :(得分:1)

编辑:在python中,如果在函数范围内分配变量,那么它就变成了局部变量。所以a_list在您a_list = some_other_list时变为本地,并且Python通过抛出未解决的参考错误来告诉您。

另外,if语句需要一个返回布尔值的表达式。

a_list = some_other_list只需将some_other_list设置为引用与some_other_listequal相同的内存地址,该地址不会返回布尔值。

然而a_list == some_other_list执行比较,返回布尔值TrueFalse以指示两个变量的值相等。

答案 2 :(得分:0)

python中===之间存在很大差异。

a = b将b的值赋给变量a。

a == b正在将a的值与b的值进行比较。

在您的情况下,您希望使用==来比较这两个值,如果它们是相同的值则返回True,否则它将返回False