Hi all, In one of numexpr's Issue: https://github.com/pydata/numexpr/issues/521 a user points out an unexpected behavior regarding refcount of a ndarray.
After some experiments I found that it can be replicated in a small example (https://dpaste.com/337WPLFCM): ``` import numpy as np import sys A = np.arange(100) B = A out = B print("real number of ref of A before del B: ", sys.getrefcount(A) - 1) del B print("real number of ref of A after del B: ", sys.getrefcount(A) - 1) del out print("real number of ref of A after del out: ", sys.getrefcount(A) - 1) print('===========') A1 = np.arange(100) B1 = A1.reshape((10, 10)) print("real number of ref of A1 before del B1: ", sys.getrefcount(A1) - 1) del B1 print("real number of ref of A1 before del B1: ", sys.getrefcount(A1) - 1) print('===========') A2 = np.arange(100) B2 = A2.reshape((10, 10)) out2 = B2 print("real number of ref of A2 before del B2: ", sys.getrefcount(A2) - 1) print("real number of ref of B2 before del B2: ", sys.getrefcount(B2) - 1) print("real number of ref of out2 before del B2: ", sys.getrefcount(out2) - 1) del B2 print("real number of ref of A2 after del B2: ", sys.getrefcount(A2) - 1) print("real number of ref of out2 after del B2: ", sys.getrefcount(out2) - 1) del out2 print("real number of ref of A2 after del out2: ", sys.getrefcount(A2) - 1) print('===========') A3 = np.arange(100) B3 = A3.reshape((10, 10)) out3 = B3 print("real number of ref of A3 before del out3: ", sys.getrefcount(A3) - 1) del out3 print("real number of ref of A3 after del out3: ", sys.getrefcount(A3) - 1) del B3 print("real number of ref of A3 after further del B3: ", sys.getrefcount(A3) - 1) ``` The output is: ``` ❯ python test_reshape.py real number of ref of A before del B: 3 real number of ref of A after del B: 2 real number of ref of A after del out: 1 =========== real number of ref of A1 before del B1: 2 real number of ref of A1 before del B1: 1 =========== real number of ref of A2 before del B2: 2 real number of ref of B2 before del B2: 2 real number of ref of out2 before del B2: 2 real number of ref of A2 after del B2: 2 real number of ref of out2 after del B2: 1 real number of ref of A2 after del out2: 1 =========== real number of ref of A3 before del out3: 2 real number of ref of A3 after del out3: 2 real number of ref of A3 after del B3: 1 ``` It seems that B2's ref of A2 is stolen by this assignment out = B2. And In A3 , B3 case, we deleteout first and it seems that the ref in out is returned back to B3. I'm not sure if this is the intended behavior and I cannot find any material or documentation about this. Any thoughts or suggestions would be helpful! Teng Liu
_______________________________________________ NumPy-Discussion mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/numpy-discussion.python.org Member address: [email protected]
