2017-03-28 136 views
0

我是一名網絡工程師,嘗試將Python編程學習爲一項工作要求。Python變量賦值更改值

我寫了下面

#Funtion此代碼砍第一和最後一個項目在列表中

def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 

當我運行就行了t時的功能,並將其分配給一個變量一個。 a在函數執行後得到列表的其餘部分,並且a成爲一個新列表。這是完美的。

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=chop(t) 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 

後來當我嘗試它工作得很好,但是a的值也變爲打印印章(t)的輸出,而我沒有通過函數印章(t)的運行變量。有人能解釋爲什麼會發生這種情況?

>>> print chop(t) 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
>>> a 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

問候 Umesh製作

+3

你不復制你的列表,所以'a'和't'指向同一個列表。如果你改變一個,他們都被改變了。 – khelwood

+0

你可能會發現這篇文章有用:[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html),這是由SO老將Ned Batchelder編寫的。另請參閱[其他語言具有「變量」,Python具有「名稱」](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)簡短的總結與好的圖表。 –

+0

你應該看看這個SO [文章](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) – latsha

回答

0

當調用斬(T),T被通過引用傳遞。所以當你執行「t.pop(0)和t.pop(len(t)-1)」操作時,它是在原始對象上完成的,而不是複製。

由於上述原因,下面是真實的,以及

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> chop(t) 
>>> t 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 
1

要保存未修改的列表t,通過a = t[:]創建它的副本,並在列表a

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=t[:] 
>>> a.pop(0) 
'a' 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> t 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> 
+0

而不是'a = t [:]; a.pop(0)'做'a = t [1:]'更有效率。從列表開始彈出時,所有後續列表項都必須向下移動。這發生在C速度,所以它相對較快,但如果可以的話,最好避免它。 –

0
t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 
a=chop(t) 
測試斬

在python中,Assignment從不復制數據。 通過執行a=chop(t)就像將變量中的函數引用存儲一樣。因此,我們每次調用a時,都會得到chop()函數執行。