Вы не меняющегося y_list
(и вы не хотите изменить его!). И поскольку вы тестируете статический y_list
в условии цикла while
, этот цикл никогда не будет завершен. Но вы : меняется z_list
, поэтому вам нужно проверить, что z_list
соответствует вашему состоянию.
И так, чтобы тест while
не сработал в первом цикле, вы должны сделать z_list
копию y_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
делая
z_list = y_list[:]
Если я только что сделал
z_list = y_list
тогда z_list
просто будет другим именем для того же объекта списка, что и y_list
, вы не получили бы два отдельных списка.
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]
Поскольку вы не меняете 'y_list' внутри цикла? Почему * * * он остановится? – jonrsharpe
Что такое 'z_list'? Похоже, что вы хотите 'y_list = [y * k для y в y_list]' –