变量值更改,没有任何显式调用

时间:2017-02-23 10:30:01

标签: python python-3.x variables

在Python 3.0中,如果我为Hangman游戏运行以下代码

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

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

print("".join(secretWord))

结果是

Apple
_____

为什么要更改密码呢?我只想修改compareWord,以便它从secretWord变为下划线。

1 个答案:

答案 0 :(得分:2)

这是因为compareWordsecretWord都指向同一个列表。

第一行代码从字符串Apple创建一个新列表,并将该列表分配给compareWord。第二行将此列表分配给print("".join(secretWord)) - 两个变量现在指向同一个列表! for循环将列表中的每个项目更改为下划线。打印此列表时,它会正确显示5个下划线。

如果您将compareWord调用移至循环后,您将看到该调用的输出也已更改为5个下划线。

解决此问题的一种简单方法是将列表的副本分配给compareWord = secretWord[:](即,新列表但具有与旧列表相同的内容)。例如:

  • 切片:compareWord = List(secretWord)
  • 新列表致电:holder.count.setText(products.getNumOfProducts());

有关如何在Python中克隆列表的详细信息,请参阅How to clone or copy a list?

有关Python和列表的一些介绍,请参阅https://developers.google.com/edu/python/lists,这也很好地显示了您遇到的问题。