Python中.pop()操作影响多列表,如何避免原列表被修改?
Python列表赋值后修改新列表影响原列表的问题解决
你遇到的核心问题是列表赋值方式错误,直接用new = old并没有创建新的列表副本,而是让两个变量指向内存中同一个列表对象,所以对new执行pop()操作时,本质是修改了这个共享的列表,自然会影响到old。
原问题代码
new = ['Bram', 'Glenn', 'Menno'] old = ['Glenn', 'Menno', 'Eefke Maria'] print('new1', new) print('old1', old) new = old print('new2', new) print('old2', old) new.pop() print('new3', new) print('old3', old)
当前输出
new1 ['Bram', 'Glenn', 'Menno'] old1 ['Glenn', 'Menno', 'Eefke Maria'] new2 ['Glenn', 'Menno', 'Eefke Maria'] old2 ['Glenn', 'Menno', 'Eefke Maria'] new3 ['Glenn', 'Menno'] old3 ['Glenn', 'Menno']
期望输出
new1 ['Bram', 'Glenn', 'Menno'] old1 ['Glenn', 'Menno', 'Eefke Maria'] new2 ['Glenn', 'Menno', 'Eefke Maria'] old2 ['Glenn', 'Menno', 'Eefke Maria'] new3 ['Glenn', 'Menno'] old3 ['Glenn', 'Menno', 'Eefke Maria']
问题原因
在Python中,列表是可变对象,new = old这种赋值操作只是将变量new的引用指向old所指向的列表对象,并没有复制列表内容。两个变量共享同一块内存地址的列表,因此任何对其中一个变量的修改都会同步反映到另一个变量上。
解决方法
要创建独立的列表副本,有三种常用方式:
- 切片语法:利用切片获取整个列表的副本
new = old[:] list()构造函数:通过构造函数生成新列表new = list(old)- 列表的
copy()方法:调用列表自带的复制方法new = old.copy()
修改后的示例代码
new = ['Bram', 'Glenn', 'Menno'] old = ['Glenn', 'Menno', 'Eefke Maria'] print('new1', new) print('old1', old) # 使用切片创建副本 new = old[:] print('new2', new) print('old2', old) new.pop() print('new3', new) print('old3', old)
修改后的输出
new1 ['Bram', 'Glenn', 'Menno'] old1 ['Glenn', 'Menno', 'Eefke Maria'] new2 ['Glenn', 'Menno', 'Eefke Maria'] old2 ['Glenn', 'Menno', 'Eefke Maria'] new3 ['Glenn', 'Menno'] old3 ['Glenn', 'Menno', 'Eefke Maria']
这样就实现了修改新列表不影响原列表的需求。
内容的提问来源于stack exchange,提问作者vincent verster
相关产品推荐
相关产品推荐

