list数组对于python带来了很大的方便,在数组中存入数据时不用有那么多的顾虑,但是对list数组赋值时要特别的注意,若是赋值不当很容易会改变原数组的值。
1,对一维数组来说使用赋值符号会影响原数组
如下代码:
li_a=[2,3,4,6,8]
li_c=li_a
li_c[0]=11
li_c[1]=11
print(li_c)
print(li_a)
将一维数组li_a赋值给数组li_c,然后只更改
li_c的前两个数值。但是从最后的输出来看两个数组中前两个的数值都被改变了。
print(li_a is li_c)
使用is语句可得到“TRUE”的结果,可见当我们使用赋值符号时,li_a和
li_c其实共享一片内存地址,当对li_c改变时li_a也会改变。
2,可以通过浅拷贝的方式来避免原数组的影响
浅拷贝的方式有很多,如下代码所示:
li_a=[2,3,4,6,8]
li_c=li_a
li_b=li_a[:] #切片方式
li_d=list(li_a) #list
print(li_a is li_c)
print(li_a is li_b)
print(li_a is li_d)
输出结果为:“True False False”
3,对二维数组赋值需要注意的问题
但是对于二维数组来说赋值和浅拷贝有时候确实无法避免对原数组的影响,如下代码所示:
li_a=lq
li_b=lq[:]
li_c=list(lq)
li_c[0][0]=0
li_c[0][2]=0
li_c[0][1]=0
li_c[1][1]=100
li_c[1][2]=100
print(li_c)
print(lq)
使用list形式对定义数组li_c,并以单个元素的形式改变数组li_c的某些值,结果在最后的输出结果中不仅li_c中的数组发生改变,lq中的数组也发生了改变!
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
若是直接是对二维数组中的一行进行改变,却不影响原数组的值:
li_c[2]=[3,3,3,3]
最后的输出结果中数组lq并没有改变:
[[0, 0, 0, 8], [5, 100, 100, 23], [3, 3, 3, 3], [8, 4, 5, 6], [34, 2, 3, 9]]
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
不过对于需要单元素的改变数组的值有不影响原数组,可使用下面代码初始化数组:
lq=[[3,4,7,8],[5,4,3,23],[34,2,3,9],[8,4,5,6],[34,2,3,9]]
lq_hang=len(lq)
lq_lie=len(lq[0])
li_real=[[0]*lq_lie for i in range(lq_hang)]
li_real[0][0]=10
li_real[0][2]=10
li_real[0][1]=10
li_real[1][1]=100
li_real[1][2]=100
print(li_real)
print(lq)
结果为:
[[0, 0, 0, 0], [0, 100, 100, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[3, 4, 7, 8], [5, 4, 3, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]