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]

Reply via email to