2017-07-18 80 views
4

對於具有多個參數的print(),我認爲它會逐個評估它們。但是,下面的代碼python 3如何打印(list,list.pop())?

a = [1, 2, 3, 4] 
print(a, a[:], a.pop(), a, a[:]) 

打印

[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3] 

我以爲蟒蛇將評估a,再a[:],然後a.pop(),然後aa[:]再次,這將打印

[1, 2, 3, 4] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3] 

那麼這個工作到底如何?

+0

相關:https://stackoverflow.com/questions/42761707/what-is-the-order-of-evaluation-in-python-when-using-pop-list-1-and –

回答

5

如果你調用一個函數(任何函數)。 參數首先從左到右進行評估。所以,你的代碼是相當於到:

arg1 = a 
arg2 = a[:] 
arg3 = a.pop() 
arg4 = a[:] 
print(arg1,arg2,arg3,arg4) 

(當然變量arg1arg2等都不在Python層面存在)

arg1將因此指向同一個列表,a,接下來我們製作一個淺拷貝的a並將其存儲在arg2,然後我們a彈出,最後一項存儲在arg3,最後我們製作另一個淺拷貝(此時的a)並將其存儲在arg4中。

這樣就意味着:

arg1 = a   # arg1 = a = [1,2,3,4] 
arg2 = a[:]  # arg2 = [1,2,3,4] 
arg3 = a.pop() # arg1 = a = [1,2,3], arg3 = 4 
arg4 = a[:]  # arg4 = [1,2,3] 
print(arg1,arg2,arg3,arg4) 

下一步print(..)語句調用這些參數,因此印刷像我們在評論中看到的。因此,它會打印:

[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] 

的重要組成部分,因此是a.pop()不僅將返回由兩個aarg1引用列表的最後一個元素,而且還修改列表(刪除最後一個元素)。因此arg1a仍然參考相同的列表,但它被修改。