0

我有一个关于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]]

第一个和第二个列表总是相同的:有人知道为什么会这样吗?

4

1 回答 1

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会创建一个包含四个对同一内部列表的引用的新列表。

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

于 2013-10-30T16:09:44.780 回答