This second section about lists is dedicated to the subtle difference between equality and identity of lists. It is really important to understand this difference in order to understand how complex data structures are realized in GAP. This section applies to all GAP objects that have subobjects, i.~e., to lists and to records. After reading the section about records (About Records) you should return to this section and translate it into the record context.
Two lists are equal if all their entries are equal. This means that the
equality operator =
returns true
for the comparison of two lists if
and only if these two lists are of the same length and for each position
the values in the respective lists are equal.
gap> numbers:= primes; [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,,,,,, 71 ] gap> numbers = primes; true
We assigned the list primes
to the variable numbers
and, of course
they are equal as they have both the same length and the same entries.
Now we will change the third number to 4 and compare the result again
with primes
.
gap> numbers[3]:= 4; 4 gap> numbers = primes; true
You see that numbers
and primes
are still equal, check this by
printing the value of primes
. The list primes
is no longer a list of
primes! What has happened? The truth is that the lists primes
and
numbers
are not only equal but they are identical. primes
and
numbers
are two variables pointing to the same list. If you change the
value of the subobject numbers[3]
of numbers
this will also change
primes
. Variables do not point to a certain block of storage memory
but they do point to an object that occupies storage memory. So the
assignment numbers:= primes
did not create a new list in a different
place of memory but only created the new name numbers
for the same old
list of primes.
The same object can have several names.
If you want to change a list with the contents of primes
independently
from primes
you will have to make a copy of primes
by the function
Copy
which takes an object as its argument and returns a copy of the
argument. (We will first restore the old value of primes
.)
gap> primes[3]:= 5; 5 gap> primes; [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,,,,,, 71 ] gap> numbers:= Copy(primes); [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,,,,,, 71 ] gap> numbers = primes; true gap> numbers[3]:= 4; 4 gap> numbers = primes; false
Now numbers
is no longer equal to primes
and primes
still is a list
of primes. Check this by printing the values of numbers
and primes
.
The only objects that can be changed this way are records and lists, because only GAP objects of these types have subobjects. To clarify this statement consider the following example.
gap> i:= 1;; j:= i;; i:= i+1;;
By adding 1 to i
the value of i
has changed. What happens to j
?
After the second statement j
points to the same object as i
, namely
to the integer 1. The addition does not change the object 1
but
creates a new object according to the instruction i+1
. It is actually
the assignment that changes the value of i
. Therefore j
still points
to the object 1
. Integers (like permutations and booleans) have no
subobjects. Objects of these types cannot be changed but can only be
replaced by other objects. And a replacement does not change the values
of other variables. In the above example an assignment of a new value to
the variable numbers
would also not change the value of primes
.
Finally try the following examples and explain the results.
gap> l:= []; [ ] gap> l:= [l]; [ [ ] ] gap> l[1]:= l; [ ~ ]
Now return to the preceding section About Lists and find out whether
the functions Add
and Append
change their arguments.
In this section you have seen the difference between equal lists and
identical lists. Lists are objects that have subobjects and therefore
can be changed. Changing an object will change the values of all
variables that point to that object. Be careful, since one object can
have several names. The function Copy
creates a copy of a list which
is then a new object.
You will find more about lists in chapter Lists, and more about identical lists in Identical Lists.
GAP 3.4.4