2016-11-19 13 views
0

なぜこのコードは永遠に動作していますか?私はあなたがy_listを変更していない(とあなたがをしたくないこれはなぜ停止しないのですか?

y_list=[1.0, 3.4 ] 
k=1 

def C(y): 
    return abs(y-round(y)) < 0.15 

while not all(C(y) for y in y_list): 
    z_list = [y*k for y in y_list] 
    k+=1 
    print(z_list) 
+9

ループ内で 'y_list'を変更しないためですか?なぜ*それは止まるのだろうか? – jonrsharpe

+0

'z_list'のポイントは何ですか? y_list = [y_list in y_list] 'のように思えるかもしれません。 –

答えて

0

y_list内のすべての数値が整数に近いとき、私は「デフC(Y)」で定義され、それを停止したいです変更する!)。 whileループ状態のstatic y_listをテストしているので、そのループは決して終了しません。しかしz_listに変更されているので、z_listが条件を満たしていることをテストする必要があります。

そして、最初のループでwhileテストが失敗しないようにするには、z_listのコピーをループ開始前にy_listにする必要があります。私はちょうど

z_list = y_list 
をした場合、私は

z_list = y_list[:] 

を行うことによってz_listy_listのコピーを作っ

y_list = [1.0, 3.4 ] 

# Copy the original data 
z_list = y_list[:] 

def C(y): 
    return abs(y-round(y)) < 0.15 

k = 1 
while not all(C(y) for y in z_list): 
    z_list = [y*k for y in y_list] 
    k+=1 
    print(z_list) 

出力

[1.0, 3.4] 
[2.0, 6.8] 
[3.0, 10.2] 
[4.0, 13.6] 
[5.0, 17.0] 

注意

次にz_listは同じリストオブジェクトの別の名前で、y_listと同じであるため、2つの別々のリストはありません。


FWIW、これを書き込む別の方法があります。私たちはitertools.countを使用するので、手動でkを更新する必要はなく、より意味のある名前を与えたmapでテスト関数を呼び出す必要があります。

from itertools import count 

y_list = [1.0, 3.4 ] 
z_list = y_list[:] 

def almost_int(y): 
    return abs(y - round(y)) < 0.15 

for k in count(2): 
    print(z_list) 
    if all(map(almost_int, z_list)): 
     break 
    z_list = [y*k for y in y_list] 
関連する問題