我在python中有一个关于迭代的问题。目前我正在尝试构建一个非常简单的神经网络,使用以下(部分)代码:
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且i = 1始终同时更新。使用 print'weights:',self.weights 打印它时,结果总是如下所示:
weights: [[0.2, 0,1, 0,8], [0,2, 0,1, 0,8]]
第一个和第二个列表总是一样的:有谁知道为什么会这样?
答案 0 :(得分:1)
您的问题在于如何初始化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
将创建一个新列表有四个引用相同的内部列表。
通过使用列表推导,您可以确保为外部列表中的每个位置创建新的内部列表。