但我需要初始化一个n*n的二维数组时,我这样写了:
arr = [[0]*n]*n
然后呢,我就对这个二维数组进行了一些神奇的操作,可是呢,输出结果却跟计划的差别大大,这到底是为什么呢。我看到别人是这么定义的
arr = [[0] for _ in range(n) for _ in range(n)]
我在命令行里用这两种方法分别定义了数组a和数组b。
但我试图a==b,结果返回了True
然后我又a[0][0]=1,b[0][0]=1;再试图a==b,结果返回了False
当n==3:则a = [[1,0,0],[1,0,0],[1,0,0]],而b = [[1,0,0],[0,0,0],[0,0,0]]
于是,我发现了问题。事实上,使用第一种方法定义定义的二维数组,a[k](0<k<n)是对a[0]的复制,即指向的是同一个对象,对数字0的重复,其实是不同的对象,而对包含n个0的a[0]而言,它是一个对象,则a[k]不过是指针的复制,所以,修改其中任何一个数据,都会是对a[k]的修改。而第二种定义方法,则是产生了n*n个数据,a[k]!=a[k`]。所以,在使用第一种方法的时候要慎重!!!