2015-10-17 11 views
11

當讀取python標準庫的profile.py時,我遇到了指定語句sys.argv[:] = args,該指令用於修改sys.argv以使得正在執行的程序可以查看正確的命令行參數。我明白這與實際操作中的sys.argv = args[:]不同,但有效它們看起來與我一樣。有人想要使用一種而不使用另一種的情況嗎?而且是a[:] = b一個常見的python成語嗎?指定vs從片段

更新:在這個特定的情況下,爲什麼會選擇一個在另一個? (來源可以在profile.pymain功能中找到)

回答

9

不同的是,當你使用a[:] = b這意味着你將覆蓋任何已經是a。如果您還有其他參考a的其他內容,它也會改變,因爲它會一直參考相同的位置。

另一方面,a = b[:]創建一個新的引用並將b中的所有值複製到此新引用。因此對舊數據的現有引用將一直指向舊數據。

考慮這個例子:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> c = a # c is a reference to the list in a 
>>> c 
[1, 2, 3] 
>>> 
>>> a[:] = b 
>>> a # a will have a copy of the list in b 
[4, 5, 6] 
>>> C# and c will keep having the same value as a 
[4, 5, 6] 
>>> 
>>> b = [7, 8, 9] 
>>> a = b[:] 
>>> a # a has the new value 
[7, 8, 9] 
>>> C# c keeps having the old value 
[4, 5, 6] 
+0

謝謝你,我意識到,這使得如果有以'了' –

+3

其它參考資料可能有助於舉一個例子的差異。如果'x = [1,2,3]'和'a = x'(所以它們引用相同的列表),則執行'a = b [:]'替換'a'中的_reference_和'b '; 'x'不變。另一方面,'a [:] = b'用'b'中的值替換'a'(其引用不變)的_contents_,這意味着'x'也被修改;參考鏈接從未打破。 – ShadowRanger

+0

我編輯添加更多細節。但一個例子應該是一件好事。我會添加它。 –