2013-10-30 3 views
0

나는 파이썬에서 반복에 관한 질문을 받았다. 함수 generate_random_weights에서반복하는 동안 값을 변경하면 여러 수준에서 값이 변경되는 이유는 무엇입니까?

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 

, I = 0 그리고 난 항상 같은 시간에 업데이트 = 1되어 순간에 나는 코드 다음 (의 일부)를 사용하여, 매우 간단한 신경망 구축을 위해 노력하고있다 . 'self.weights :

weights: [[0.2, 0,1, 0,8], [0,2, 0,1, 0,8]] 

첫 번째와 두 번째 목록은 항상 동일합니다 결과는 항상 print'weights을 사용하여 다음과 같은 경우 인쇄이 같은이며, 이런 사람이 왜 알고 있나요 ?

답변

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은 동일한 내부 목록에 대한 4 개의 참조가있는 새 목록을 생성합니다.

대신 목록 이해를 사용하면 외부 목록의 각 위치에 대한 새로운 내부 목록을 만들 수 있습니다.

관련 문제