2015-07-28 14 views
5

Oto mój generator:Dlaczego ten generator python zwraca tę samą wartość za każdym razem?

import numpy as np 

def fun(): 
    state = [1, 2] 
    for i in range(10): 
     for j, var in enumerate(state): 
      next_st = np.random.randint(0, 3) 
      state[j] = next_st 
     yield state 

I tu jest wyjście, gdy nazywam go:

>>> g = fun(); y = [x for x in g]; y 
[[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0], 
[2, 0]] 

Gdybym ponownie wykonać instrukcję, mam coś innego niż [2, 0] (ze względu na np.random call), ale ta sama wartość we wszystkich y.

Odpowiedz

4

Powtarzasz ten sam obiekt listy. Twój generator zwraca jeden obiekt w kółko, manipulując go jak to jest, ale wszelkie inne odniesienia do niej zobaczyć te same zmiany:

>>> g = fun(); y = [x for x in g]; y 
[[2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1]] 
>>> y[0] is y[1] 
True 
>>> y[0][0] = 42 
>>> y 
[[42, 1], [42, 1], [42, 1], [42, 1], [42, 1], [42, 1], [42, 1], [42, 1], [42, 1], [42, 1]] 

wydajności o kopię listy lub utworzyć nowy świeży obiekt listy zamiast manipulować jednym.

def fun(): 
    state = [1, 2] 
    for i in range(10): 
     for j, var in enumerate(state): 
      next_st = np.random.randint(0, 3) 
      state[j] = next_st 
     yield state[:] # copy 

def fun(): 
    for i in range(10): 
     state = [1, 2] # new list object each iteration 
     for j, var in enumerate(state): 
      next_st = np.random.randint(0, 3) 
      state[j] = next_st 
     yield state 
4

Jesteś yielding samo list/object więc zawsze patrz ostatnie wartości dodanych do listy. Należy otrzymując kopię:

yield state[:] 

Albo utworzyć listę wewnątrz pierwszej pętli:

for i in range(10): 
     state = [1, 2] 

Byłoby tak łatwo dołączyć do pustej listy w pętli wewnętrznej, tworząc nową listę/obiekt za każdym razem:

def fun(): 
    for i in range(10): 
     state = [] 
     for j in range(2): 
      next_st = np.random.randint(0, 3) 
      state.append(next_st) 
     yield state 
Powiązane problemy