Python 为什么在迭代过程中更改值会更改多个级别上的值?

Python 为什么在迭代过程中更改值会更改多个级别上的值?,python,python-2.7,Python,Python 2.7,我有一个关于python中迭代的问题。目前,我正在尝试使用以下(部分)代码构建一个非常简单的神经网络: 在函数generate_random_weights中,i=0和i=1始终同时更新。使用print'weights:'和self.weights打印时,结果总是如下所示: 第一个和第二个列表总是一样的:有人知道为什么会发生这种情况吗 您的问题在于如何初始化权重: weights = [[0] * self.n_input ] * (self.n_neurons) 这相当于以下内容: inne

我有一个关于python中迭代的问题。目前,我正在尝试使用以下(部分)代码构建一个非常简单的神经网络:

在函数generate_random_weights中,i=0和i=1始终同时更新。使用print'weights:'和self.weights打印时,结果总是如下所示:


第一个和第二个列表总是一样的:有人知道为什么会发生这种情况吗

您的问题在于如何初始化权重:

weights = [[0] * self.n_input ] * (self.n_neurons)
这相当于以下内容:

inner_list = [0] * self.n_input
weights = [inner_list] * (self.n_neurons)
希望这能清楚地表明
权重的每个元素都是同一列表的副本,而您应该使用如下内容:

weights = [[0] * self.n_input for _ in range(self.n_neurons)]
这里需要记住的重要一点是,如果值都是不可变的,则只应使用
*
创建一个列表,因此
[0]*4
是安全的,但是
[[0]]*4
将创建一个新列表,其中包含对同一内部列表的四个引用

通过使用列表理解,您可以确保为外部列表中的每个位置创建新的内部列表

inner_list = [0] * self.n_input
weights = [inner_list] * (self.n_neurons)
weights = [[0] * self.n_input for _ in range(self.n_neurons)]