为什么在迭代期间更改值会在多个级别上更改值?

时间:2013-10-30 16:05:13

标签: python python-2.7

我在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]]

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

1 个答案:

答案 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将创建一个新列表有四个引用相同的内部列表。

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