2017-08-29 32 views
1

我不完全确定这种行为是否可以预料,但它确实很奇怪。当你有这样的代码:未解决的引用与Python中的列表

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 

突然,出现了一个问题,它说,a_list第2行是一个悬而未决的参考。为什么if语句中的内容会影响a_list是否可以解决?这种事情是否正常?这可能是Python 3.6.1或PyCharm(Community Edition 2017.1.5)中的一个错误?任何帮助澄清这将不胜感激。

+3

比较用==完成,不用=。 –

+1

你可以发布完整的代码('a_list'和'some_other_list'的定义)吗?你的第二行(修改)会产生一个_SyntaxError_,但根据你的意思,它不会(所以'='可能是一个错字?)。 – CristiFati

+0

行'3'代替'print()'。当你分配给'a_list'时,它试图创建一个本地'a_list',这意味着你在比较中使用'a_list'现在失败了。在函数的第一行执行'global a_list'会解决这个问题,但是你真的应该考虑传入和返回值到函数和全局变量中。 – AChampion

回答

3

只要你访问的变量不是你的函数本地的,只要它们在外部范围内的某个地方找到,一切都可以正常工作。但只要你分配给一个变量,它就成为你的函数的局部。 Python不再在变量名的外部作用域中查找。所以,当你包括:

a_list = some_other_list 

行:

a_list != some_other_list 

会失败,因为它看起来并不为a_list你的函数外了,如果你在函数以后再定义它,它是一个UnboundLocalError或类似。

如果您有兴趣,我确实在另一个answer中了解更多细节。


如果你只是想比较平等的变化=(分配)到==(平等检查)。

+0

因此,Python在执行函数之前首先根据fun中的赋值区分局部变量。即使分配在if条件之内? – akp

+1

是的,即使它会在一个无法访问的'如果False:'块内函数:)当然这个函数的参数也是本地的:) – MSeifert

0

python中的===有很大的区别。

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

a == b正在比较a的值和b的值。

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

+1

第3行是print()函数。 – AChampion

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以指示两个变量的值相等。

+1

第3行是'print()'函数。 – AChampion

+0

谢谢。我纠正了答案。 –