# 2 different ways to initialise a 2d list give different results

**URL:** <https://discuss.python.org/t/2-different-ways-to-initialise-a-2d-list-give-different-results/20955>\
**Category:** Python Help\
**Created:** [November 11, 2022, 4:01am UTC](https://discuss.python.org/t/2-different-ways-to-initialise-a-2d-list-give-different-results/20955 "2022-11-11T04:01:11Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![claytonjohnroby](https://avatars.discourse-cdn.com/v4/letter/c/ecb155/32.png) [@claytonjohnroby](https://discuss.python.org/u/claytonjohnroby)\
**Post date:** [November 11, 2022, 4:01am UTC](https://discuss.python.org/t/2-different-ways-to-initialise-a-2d-list-give-different-results/20955/1 "2022-11-11T04:01:11Z")

</div>

I was initialising a 2d list and was getting strange results.  
After some furtling around I found that the way I was initialising the list had an unexpected impact.

```auto
rows =2
columns= 2
Array=[[0]*columns]*rows
mylist = [[0 for x in range(columns)] for x in range(rows)]
print (Array)
print (type(Array))
print (type(Array[0]))
print (type(Array[0][0]))
print (mylist)
print (type(mylist))
print (type(mylist[0]))
print (type(mylist[0][0]))
x=1
for i in range(rows):
    for j in range(columns):
        Array[i][j] = '%s,%s,%s'%(i,j,x)
        mylist[i][j] = '%s,%s,%s'%(i,j,x)
        x+=1
print (Array)
print (mylist)

```

Gives output:

```auto
[[0, 0], [0, 0]]
<class 'list'>
<class 'list'>
<class 'int'>
[[0, 0], [0, 0]]
<class 'list'>
<class 'list'>
<class 'int'>
[['1,0,3', '1,1,4'], ['1,0,3', '1,1,4']]
[['0,0,1', '0,1,2'], ['1,0,3', '1,1,4']]

```

I am a bit puzzled by this. It seems both outer list entries for the Array are being treated as the same object. Any explanation would be welcome.

---

<div class="post-metadata">

**Author:** ![MRAB](https://avatars.discourse-cdn.com/v4/letter/m/e9c0ed/32.png) [@MRAB](https://discuss.python.org/u/MRAB)\
**Post date:** [November 11, 2022, 4:39am UTC](https://discuss.python.org/t/2-different-ways-to-initialise-a-2d-list-give-different-results/20955/2 "2022-11-11T04:39:43Z")

</div>

Python works with references. It won’t copy objects unless you do so explicitly. When you multiply a list, you’re not duplicating objects, you’re duplicating _references_ to objects.

---

<div class="post-metadata">

**Author:** ![claytonjohnroby](https://avatars.discourse-cdn.com/v4/letter/c/ecb155/32.png) [@claytonjohnroby](https://discuss.python.org/u/claytonjohnroby)\
**Post date:** [November 11, 2022, 6:31am UTC](https://discuss.python.org/t/2-different-ways-to-initialise-a-2d-list-give-different-results/20955/3 "2022-11-11T06:31:47Z")

</div>

That worked. The site I read that showed initialising a 2d array with

```auto
array=[[0]*rows]*columns]

```

without mentioning this gotcha was obviously incomplete.

Thanks for the help.
