为什么在更改多个级别的值时更改值?
问题描述:
我有一个关于python中的itteration的问题。目前,我想建立一个非常简单的神经网络,使用如下代码(的部分):为什么在更改多个级别的值时更改值?
class neural_net:
def __init__(self, n_neurons, n_input):
self.n_neurons = n_neurons
self.n_input = n_input
self.input = []
self.weights = []
self.output = []
def generate_input(self):
input = [0.0,0.0,1.0]
self.input = input
def generate_random_weights(self):
weights = [[0] * self.n_input ] * (self.n_neurons)
for i in range(self.n_neurons):
for ii in range(self.n_input):
weights[i][ii] = round(random.random(), 1)
self.weights = weights
在功能generate_random_weights,I = 0和我在同一时间= 1总是更新。结果总是像下面这样在打印它,使用print'weights:”,self.weights:
weights: [[0.2, 0,1, 0,8], [0,2, 0,1, 0,8]]
第一和第二列表始终是相同的:没有人知道为什么会这样?
答
你的问题是你如何初始化weights
:
weights = [[0] * self.n_input ] * (self.n_neurons)
这等同于以下内容:
inner_list = [0] * self.n_input
weights = [inner_list] * (self.n_neurons)
希望这清楚地表明的weights
每个元素都是相同的副本列表,而应该使用类似这样的东西:
weights = [[0] * self.n_input for _ in range(self.n_neurons)]
这里要记住的重要一点是,如果值都是不可变的,那么只应使用*
来创建列表,因此[0] * 4
是安全的,但[[0]] * 4
将创建一个带有四个对同一内部列表的引用的新列表。
通过使用列表理解,而不是您可以确保您为外部列表中的每个位置创建一个新的内部列表。