# Changing array values

**URL:** <https://www.ruby-forum.com/t/changing-array-values/165427>\
**Category:** Ruby\
**Created:** [April 13, 2009, 10:41pm UTC](https://www.ruby-forum.com/t/changing-array-values/165427 "2009-04-13T22:41:59Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [April 13, 2009, 10:41pm UTC](https://www.ruby-forum.com/t/changing-array-values/165427/1 "2009-04-13T22:41:59Z")

</div>

What I’d like is an array of objects, each of which contains an array of  
integers, and each successive object in the array should contain a  
slightly different array of integers than the previous object.

For some reason, when I run the code below:

class TEST  
def initialize(args)  
@args = args  
end  
def describe  
return @args.join(", ")  
end  
end

def test  
old = [0,0,0,0,0,0]  
tests = []  
5.times do |i|  
new = old  
new[rand(old.size)] = rand(5) # randomly changes one of the members  
of the array to a number from 0 to 4  
tests[i] = TEST.new(new)  
puts tests[i].describe  
end  
return tests  
end

I get this output:

0, 0, 0, 0, 0, 0  
0, 0, 0, 0, 0, 1  
0, 0, 0, 0, 0, 4  
0, 0, 0, 2, 0, 4  
0, 0, 1, 2, 0, 4  
[#\<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]\>,  
#\<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]\>,  
#\<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]\>,  
#\<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]\>,  
#\<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]\>]

As you can see, each object in the object array contains the last array  
of integers, even though the objects are being initialized with  
different arrays of integers.

Strangely enough, if I use a single integer everywhere I here use an  
array, everything works just fine.

I cannot for the life of me figure out why this is happening and would  
be extremely grateful it if someone could enlighten me . . .

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [April 13, 2009, 10:46pm UTC](https://www.ruby-forum.com/t/changing-array-values/165427/2 "2009-04-13T22:46:25Z")

</div>

> end  
> [#\<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]\>,  
> #\<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]\>,  
> #\<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]\>,  
> #\<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]\>,  
> #\<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]\>]

When you set ‘new = old’, you’re just creating another reference to the  
same  
array. To copy the array, use ‘new = old.dup’. (dup = duplicate)

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [April 13, 2009, 10:51pm UTC](https://www.ruby-forum.com/t/changing-array-values/165427/3 "2009-04-13T22:51:36Z")

</div>

James C. wrote:

> > end  
> > [#\<TEST:0x3f3d9f0 @args=[0, 0, 1, 2, 0, 4]\>,  
> > #\<TEST:0x3f3d9d8 @args=[0, 0, 1, 2, 0, 4]\>,  
> > #\<TEST:0x3f3d900 @args=[0, 0, 1, 2, 0, 4]\>,  
> > #\<TEST:0x3f3d828 @args=[0, 0, 1, 2, 0, 4]\>,  
> > #\<TEST:0x3f3d750 @args=[0, 0, 1, 2, 0, 4]\>]
> 
> When you set ‘new = old’, you’re just creating another reference to the  
> same  
> array. To copy the array, use ‘new = old.dup’. (dup = duplicate)

Ahh, fantastic! Thank you.
