2012-02-28 29 views
1

我有一個循環,其中在每次迭代中I(重新)計算的值的長向量:一個KeyboardInterrupt - 它是安全的複製的數據

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

long_veclast_vec是numpy的陣列。

我的問題是:我可以確定,當我按CTRL + C時,它不會打破copy()函數,並且last_vec不被破壞?

+0

按Ctrl + C只能打破Python代碼。所以這取決於''long_vec.copy()'是用Python還是C來實現的。你必須看看NumPy的源代碼 - 或者等待別人爲你做這件事。 :) – 2012-02-28 17:08:54

+0

@SvenMarnach::)我相信它是在C中,但讓我們考慮最糟糕的一般情況,所有的都在Python – 2012-02-28 17:12:52

回答

5

重要的不是.copy(),它是隨後的參考分配(last_vec =)。

我相信賦值在CPython中是原子的(即它需要一個字節碼指令)。

換句話說,last_vec可以包含上一次迭代的值或當前迭代的複製值。按Ctrl-C不能導致last_vec包含新值的部分副本。

+0

你是對的,分配的原子性是重要的。 (它是原子的,字節碼是一個'STORE_NAME'指令。) – 2012-02-28 17:16:49

0

你可以確保它使用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() 
相關問題