2017-08-29 63 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

謝謝。我糾正了答案。 –