KeyboardInterrupt - это безопасно для скопированных данных - PullRequest
1 голос
/ 28 февраля 2012

У меня есть цикл, в котором на каждой итерации я (заново) вычисляю длинный вектор значений:

try:
    while(1):
        long_vec = recalculate( long_vec )
        last_vec = long_vec.copy()
except KeyboardInterrupt:
    print last_vec

long_vec и last_vec являются массивами numpy.

Мой вопрос: могу ли я быть уверен, что когда я нажму CTRL + C, он не сломает функцию copy () и last_vec не сломается?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2012

Важен не .copy(), а последующее присвоение ссылки (last_vec =).

Я считаю, что это назначение является атомарным в CPython (то есть требуется одна инструкция байт-кода).

Другими словами, last_vec может содержать либо значение из предыдущей итерации, либо скопированное значение из текущей итерации.Нажатие Ctrl-C не может привести к last_vec, содержащему частичную копию нового значения.

0 голосов
/ 28 февраля 2012

Вы можете убедиться, что оно скопировано, используя блок finally:

while True:
    try:
        long_vec = recalculate(long_vec)
    except KeyboardInterrupt:
        print long_vec # last_vec == long_vec in your example
    finally:
        # does not make sense, since the program halts after that:
        last_vec = long_vec.copy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...