[Tutor] no. of references

Payal payal-python at scriptkitchen.com
Tue Jun 8 16:25:13 CEST 2010


Hi all,
Excuse for TOFU. Thanks a lot Steven, Dave and Hugo.
Steven the explanation was really great. Thanks a  lot for it.
Hugo, I was just curious, have no real need. Thanks.

With warm regards,
-Payal
-- 


On Tue, Jun 08, 2010 at 08:07:28PM +1000, Steven D'Aprano wrote:
> On Tue, 8 Jun 2010 04:08:15 pm Payal wrote:
> > Hi,
> > If I have a list (or a dict), is there any way of knowing how many
> > other variables are referencing the same object?
> 
> Sort of. The question is simple, but the answer isn't. It depends what 
> you mean by "variables", and it requires a good understanding of 
> Python's programming model.
> 
> Python doesn't have "variables" like C or Pascal, it has names and 
> objects. Objects can be bound to no names at all:
> 
> len([1,2,4])
> 
> or to a single name:
> 
> x = [1,2,4]
> len(x)
> 
> or to multiple names:
> 
> x = y = z = [1,2,4]
> w = y
> len(w)
> 
> 
> Objects can also be referenced by other objects, which in turn could 
> have zero, one or more names. Consider this example:
> 
> >>> a = [1,2,4]
> >>> b = a
> >>> c = {None: ('xyz', b)}
> >>> class K:
> ...     pass 
> ...
> >>> d = K()
> >>> d.attr = [c]
> 
> 
> Given your question, how many "variables" refer to the list [1,2,4]?, 
> what answer would you expect? Depending on how I count them, I get 
> either 4, 5 or 6:
> 
> 4:
> "variables" (names) a, b, c and d
> 
> 5:
> the dict globals() has two references to the list, using keys 'a' 
> and 'b';
> the tuple ('xyz', b);
> the dict with key None and value the above tuple;
> the list [c];
> the instance d has a dict __dict__ with key 'attr'
> 
> 6:
> same as five, but counting globals() twice
> 
> 
> Interestingly, Python has a standard tool for tracking referrers, the gc 
> (garbage collector) module, and it disagrees with all of those counts:
> 
> >>> import gc
> >>> len(gc.get_referrers(a))
> 2
> >>> print gc.get_referrers(a)
> [('xyz', [1, 2, 4]), {'a': [1, 2, 4], 'c': {None: ('xyz', [1, 2, 
> 4])}, 'b': [1, 2, 4], 'd': <__main__.C instance at 0xb7f6008c>, 'gc': 
> <module 'gc' (built-in)>, '__builtins__': <module '__builtin__' 
> (built-in)>, 'C': <class __main__.C at 
> 0xb7d0602c>, '__name__': '__main__', '__doc__': None}]
> 
> So gc says two objects *directly* refer to the list: the tuple, and 
> globals(). But of course there are multiple *indirect* references to 
> the list as well. So the answer you get depends on the way you ask it.
> 
> 
> -- 
> Steven D'Aprano
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor


More information about the Tutor mailing list