MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Garbage collection for objects?

  • To: mathgroup at
  • Subject: [mg93467] Re: Garbage collection for objects?
  • From: David Bailey <dave at>
  • Date: Mon, 10 Nov 2008 03:29:50 -0500 (EST)
  • References: <gf6drt$k28$>

Jochen Adamek wrote:
> Hello,
> i would like to know, if it's possible to overwrite objects, which are
> defined as parameters for functions?
> I made the experience, that you have to define a copy of this objects
> to change values of them.
> I don't know how Mathematica manage these copies. Is there a method
> like garbage collection?
> Shall i delete these objects manually?
> Best regards
> J.A.
First, it is usually not useful to think of Mathematica in terms of 
another language such as Java, because the relationship is not simple. 
Garbage collection is performed by reference counting, and is meant to 
be invisible to the user.

You can modify a structure provided you reference it using the variable 
that has it as a value. For the sake of simplicity, let us assume that 
the structure that you want to modify is a list, and consider the 
following three functions and a global variable containing some data:

In[2]:= foo1[ll_] := (ll[[2]] = 42);
foo2[ll_] := Module[{tmp = ll}, tmp[[2]] = 42];

In[4]:= SetAttributes[foo3, HoldFirst];
foo3[ll_] := (ll[[2]] = 42);

In[6]:= myList = {1, 2, 3, 4}

Out[6]= {1, 2, 3, 4}

The first version fails with an error because you are trying to modify 
an actual list:

In[7]:= foo1[myList];

During evaluation of In[7]:= Set::setps: {1,2,3,4} in the part \
assignment is not a symbol. >>

Out[8]= {1, 2, 3, 4}

The second version does not generate an error, but modifies the contents 
of variable tmp - so there is no permanent effect.

In[9]:= foo2[myList];

Out[10]= {1, 2, 3, 4}

This version works and actually modifies the value of the global 
variable, because the HoldFirst attribute suppresses the evaluation of 
myList to its value - the actual variable gets passed as the argument.

In[11]:= foo3[myList];

Out[12]= {1, 42, 3, 4}

Clearly there are some fairly subtle things going on here. If you have a 
variable aaa whose value is a large list (say), then the list is not 
copied if you execute


However, if you subsequently modify the list held by bbb, a copy is 
taken so that the results are as if the system always performed a copy!

David Bailey

  • Prev by Date: Re: NIntegrate[UnitStep[...]PDF[...],{x,...}] hard to integrate
  • Next by Date: Re: From reactions to differential equations
  • Previous by thread: Re: Fourier Transform
  • Next by thread: Syntax Coloring