25

As I understand, sys.getrefcount() returns the number of references of an object, which "should" be 1 in the following case:

import sys,numpy
a = numpy.array([1.2,3.4])
print sys.getrefcount(a)

However, it turned out to be 2! So, if I:

del a

Will the "numpy.array([1.2,3.4])" object still be there (no garbage collection)?

codeforester
  • 39,467
  • 16
  • 112
  • 140
Hailiang Zhang
  • 17,604
  • 23
  • 71
  • 117

2 Answers2

38

When you call getrefcount(), the reference is copied by value into the function's argument, temporarily bumping up the object's reference count. This is where the second reference comes from.

This is explained in the documentation:

The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

As to your second question:

If I "del a", will the "numpy.array([1.2,3.4])" object still be there (no garbage collection)?

By the time getrefcount() exits, the array's reference count will to back to 1, and a subsequent del a would release the memory.

NPE
  • 486,780
  • 108
  • 951
  • 1,012
  • 1
    If it were "copied by value" there would be no second reference. Python passes arguments by reference, and never copies values unless explicitly asked. – bukzor Mar 07 '14 at 23:37
  • 4
    @bukzor: If you read the answer carefully, you'll see that the words "by value" apply to the word "reference", which you have conveniently omitted from your quote. It seems clear that you've misunderstood what I was trying to say. Unfortunately, I don't see how I reword the answer to improve the clarity and precision; if you have any specific suggestions, let me know. – NPE Mar 08 '14 at 07:54
  • 5
    When you call getrefcount(), that function's local variables reference the given argument, temporarily bumping up the object's reference count. – bukzor Mar 08 '14 at 19:57
  • 2
    @NPE I still think that "reference is copied" is a wrong description. I would rather say that "a new reference for the object is created" –  Sep 09 '18 at 23:51
-1

Because of "self" variable which is compulsory be present in constructor of class. Self is also a reference variable.

Aman Gaur
  • 1
  • 1