Regarding nparray reshape() and refcount

腾刘 via NumPy-Discussion <[email protected]>
Newsgroups gmane.comp.python.numeric.general
Message-ID <CAOgYcPEpp_nxw6Y0KTx0BmgP=9wUH-0nw3H7KCr1M3tD+yqfNA@mail.gmail.com>
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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.