using "*" to make a list of lists with repeated (and independent) elements

88888 Dihedral dihedral88888 at googlemail.com
Wed Sep 26 17:45:58 EDT 2012


TP於 2012年9月27日星期四UTC+8上午5時25分04秒寫道:
> Hi everybody,
> 
> 
> 
> I have tried, naively, to do the following, so as to make lists quickly:
> 
> 
> 
> >>> a=[0]*2
> 
> >>> a
> 
> [0, 0]
> 
> >>> a[0]=3
> 
> >>> a
> 
> [3, 0]
> 
> 
> 
> All is working fine, so I extended the technique to do:
> 
> 
> 
> >>> a=[[0]*3]*2
> 
> >>> a
> 
> [[0, 0, 0], [0, 0, 0]]
> 
> >>> a[0][0]=2
> 
> >>> a
> 
> [[2, 0, 0], [2, 0, 0]]
> 
> 
> 
> The behavior is no more expected!
> 
> The reason is probably that in the first case, 0 is an integer, not a list, 
> 
> so Python copies two elements that are independent.
> 
> In the second case, the elements are [0,0,0], which is a list; when Python 
> 
> copies a list, he copies in fact the *pointer* to the list, such that we 
> 
> obtain this apparently strange behavior.
> 
> 
> 
> Is it the correct explanation?
> 
> In these conditions, how to make this list [[0,0,0],[0,0,0]] with "*" 
> 
> without this behavior?
> 
> 
> 
> Thanks,
> 
> 
> 
> TP

def zeros(m,n):
	for i in xrange(m):
		for j in xrange(n):
			a[i][j]=0
	return a

>>> a=zeros(3,2)
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> 

I think this is what you want.



More information about the Python-list mailing list