python中列表赋值过程中原列表随新列表变化的原因及解决方式
python在利用列表处理数据时,由于是位置传递,操作不当常常会导致原数据被改变,本博客则记录了解决该问题的几种方法。
首先说明一下什么是值传递,什么是位置传递,以及案例说明。
a=1
b=a
print(a, b) #输出为 1, 1
b=3
print(a, b) #输出为 1, 3
以上即为值传递,对于数而言,位置指向的是值,即当b=a时只是将a的值赋给了b,由于值相同,此时a,b是指向同一位置,但当b的值发生改变时,b的id也随着b值的改变而改变,而a的值和位置均不变,这里可以通过打印a,b的id进行查看,如下:
a=1
b=a
print(id(a)) #输出为 94823332457152
print(id(b)) #输出为 94823332457152
b=3
print(id(b)) #输出为 94823332457216
而列表则不一样,列表属于位置传递,列表之间存在赋值时,其本质上是赋值的两个列表指向同一位置,当指向同一位置的任意一个列表变化时,由于是根据位置进行查询,另一个列表也随之改变,例子如下:
a=[1,2,3,4,5]
b=a
print(a, b) #输出均为 [1,2,3,4,5]
b.append(6)
print(a, b) #输出均为 [1,2,3,4,5,6]
同样,我们从id上进行分析,如下:
a=[1,2,3,4,5]
b=a
print(id(a), id(b)) #输出均为 140120064416456
b.append(6)
print(id(a), id(b)) #输出仍均为 140120064416456
可见,与数的赋值不一样,当列表发生改变时,列表所指向的位置并未发生变化,而是位置上对应的值发生了变化,此时也导致指向该位置的所有列表的值均发生了变化。
但在实际的应用中,尤其是要反复调用某一初始的列表时,我们往往不希望其发生改变,此时应该怎么做呢?共包含两种形式:
方法一:list.copy()
a=[1,2,3,4,5]
b=a.copy()
b.append(6)
print(a, b) #输出分别为:[1,2,3,4,5]、[1,2,3,4,5,6]
方法二:b=a[:]
a=[1,2,3,4,5]
b=a[:]
b.append(6)
print(a, b) #输出分别为:[1,2,3,4,5]、[1,2,3,4,5,6]
以上就可以很好地解决列表在赋值过程中原列表发生变化的情况啦!!!