Python教程

Python中列表操作函数append的浅拷贝问题

本文主要是介绍Python中列表操作函数append的浅拷贝问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
L=int(input())#L位数
N=int(input())#N进制
row=[]
list1=[]
for i in range(1,N):
    row.append(1)

list1.append(row)

for i in range(1,L+1):
    row.clear()

    for n in range(N):
        if n==0:
            sum=sum(list1[i-1])-list1[i-1][n+1]
            row.append(sum)
        elif n==N-1:
            sum=sum(list1[i-1])-list[i-1][n-1]
            row.append(sum)
        else:
            sum=sum(list[i-1])-list[i-1][n-1]-list1[i-1][n+1]
            row.append(sum)
print(list1)

问题起源:在做蓝桥杯练习时,发现上述代码运行时出现list index of range列表越界问题,在debug后发现是因为append函数的浅拷贝:list1在储存了row列表之后,再运行row.clear() 导致list1中数据被清空,
问题原理:在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。
append() 函数当 list 类型的对象进行 append 操作时,实际上追加的是该对象的引用。因此使用clear()函数时,把row列表清空的同时,也会把list1列表中的元素清空
解决方法:使用深拷贝:引入copy模块,使用deepcopy()方法,对应的 上述代码修改为list1.append(copy.deepcopy(row))

 

这篇关于Python中列表操作函数append的浅拷贝问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!