2017-02-23 21 views
1

在Python 3.0,如果我運行下面的代碼爲劊子手遊戲變量值改變,沒有任何顯式調用

secretWord = list("Apple") 
compareWord = secretWord 
print("".join(secretWord)) 

for (index , alphabet) in enumerate(secretWord): 
    compareWord[index] = "_" 

print("".join(secretWord)) 

結果是

Apple 
_____ 

爲什麼會更改加密詞?我只想修改compareWord,使其從secretWord變爲具有下劃線。

回答

2

這是因爲這兩個secretWordcompareWord指向同一個列表。

第一行代碼從字符串Apple創建一個新列表,並將該列表分配給secretWord。第二行將此列表分配給compareWord - 兩個變量現在指向相同的列表! for-loop將列表中的每個項目都改爲下劃線。打印此列表時,它正確顯示5個下劃線。

如果您將print("".join(secretWord))調用移至循環後,您將看到該調用的輸出也已更改爲5個下劃線。

解決此問題的一個簡單方法是將列表的副本分配給compareWord(即新列表,但與舊列表的內容相同)。對於〔實施例:

  • 切片:compareWord = secretWord[:]
  • 新列表調用:compareWord = List(secretWord)

有關如何克隆在Python列表中的一些詳細信息,請參閱How to clone or copy a list?

有關Python的一些介紹和列表,見https://developers.google.com/edu/python/lists,這也很好地顯示了你遇到的問題。

2

列表是可變的對象,並在下面的行你creatign的secretWord另一個副本名稱compareWord

compareWord = secretWord 

因此,當你改變了compareWord要更改的主要目的是什麼secretWord指向。

爲了解決該問題,您需要傳遞一份您的清單副本,如果是1d清單,則可以使用淺拷貝,否則使用copy.deepcopy

compareWord = secretWord[:] # shallow copy