python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())

目录
  • 1、浅拷贝和深拷贝
  • 2、直接赋值
  • 3、for循环
  • 4、切片
  • 5、copy()方法
    • (1)list.copy()方法
    • (2)copy.copy()方法
  • 6、deepcopy()方法

1、浅拷贝和深拷贝

浅拷贝复制指向某个对象的地址(指针),而不复制对象本身,新对象和原对象共享同一内存。

深拷贝会额外创建一个新的对象,新对象跟原对象并不共享内存,修改新对象不会影响到原对象。

赋值其实就是引用了原对象。两者指向同一内存,两个对象是联动的,无论哪个对象发生改变都会影响到另一个。

2、直接赋值

使用=来复制一个列表,实际上不仅复制了其中的内容,也复制了其内存地址,即引用了原列表。使用id()方法查看内存地址也是一样的。修改其中一个列表,也会直接更改另一个列表。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    # 直接复制,即引用列表
    b = a
    print(a)
    print(b)
    # 通过id()查看内存地址,为一样的
    print(id(a), id(b))
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
2030264836936 2030264836936
['g', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

3、for循环

使用for循环进行拷贝,仅第一层为深拷贝,对其它层依然是浅拷贝。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    b = []
    # 使用for循环进行拷贝,仅第一层为深拷贝
    for i in a:
        b.append(i)
    print(a)
    print(b)
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

4、切片

使用切片方法进行拷贝,也仅对第一层为深拷贝,对其它层依然是浅拷贝。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    # 使用切片进行拷贝,仅第一层为深拷贝
    b = a[:]
    print(a)
    print(b)
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

5、copy()方法

(1)list.copy()方法

使用list.copy()方法进行拷贝,也仅对第一层为深拷贝,对其它层依然是浅拷贝。由于列表中嵌套的列表实际保存的是地址,依然指向同一个内存地址。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    # 使用list.copy()方法进行拷贝,仅第一层为深拷贝
    b = a.copy()
    print(a)
    print(b)
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

(2)copy.copy()方法

使用copy.copy()方法进行拷贝,也仅对第一层为深拷贝,对其它层依然是浅拷贝。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import copy

if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    # 使用copy.copy()方法进行拷贝,仅第一层为深拷贝
    b = copy.copy(a)
    print(a)
    print(b)
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

6、deepcopy()方法

使用copy.deepcopy()方法进行拷贝,对所有层均为深拷贝,改变新列表并不会影响到原列表,推荐使用。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import copy

if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    # 使用copy.deepcopy()方法进行拷贝,对所有层均为深拷贝
    b = copy.deepcopy(a)
    print(a)
    print(b)
    b[0] = "g"
    b[1][0] = "f"
    print(a)
    print(b)

输出:

['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
 
Process finished with exit code 0

到此这篇关于python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())的文章就介绍到这了,更多相关python list列表复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python列表的切片与复制示例分析

    大家可以先参考python切片复制列表的知识点详解这篇内容,对知识点用法有个了解 切片,即处理一个完整列表中部分数据. 语法 变量[起始索引:终止索引:步长] 首先创建一个字符串列表 >>> cars = ['toyota', 'honda', 'mazda', 'nissan', 'mitsubishi', 'subaru', 'suzuki', 'isuzu'] >>> >>> cars ['toyota', 'honda', 'mazda', '

  • Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用两种方法实现对列表l1的拷贝 l2 = l1 l3 = l1[:] print(l1) # [5, 4, 3, 2, 1] print(l2) # [5, 4, 3, 2, 1] print(l3) # [5, 4, 3, 2, 1] #修改l1 l1[0] = 9 print(l1) # [9,

  • python数组的复制与列表中的pop

    目录 1 使用赋值运算符 2 浅拷贝 3 深度拷贝 4 深度拷贝进阶 让我们看看如何在 Python 中复制数组. 有 3 种复制数组的方法: 只需使用赋值运算符. 浅拷贝 深拷贝 1 使用赋值运算符 我们可以使用赋值运算符 (=) 创建数组的副本. 语法: new_arr = old_ arr 在 Python 中,Assignment 语句不复制对象,它们在目标和对象之间创建绑定. 当我们使用 = 运算符时,用户认为这会创建一个新对象: 好吧,事实并非如此. 它只创建一个共享原始对象引用的新

  • Python基础详解之列表复制

    一.前言 Python中列表的复制分为几种情况: 直接赋值 浅复制 深复制 下面通过实例分析一下这几种情况的区别. 二.直接赋值 a = [11, 22, 33] b = a print(id(a), id(b)) b[0]=1 print(a,b) 输出结果为如下所示,发现内存地址没有发生变化,b只是a的引用,通过b更改列表的值时,a同时做修改. 三.用切片赋值 a = [11, 22, 33] b = a[:] print(id(a), id(b)) b[0]=1 print(a,b) 输出

  • python函数调用,循环,列表复制实例

    我就废话不多说了,大家还是直接看代码吧! year=int(raw_input('year:\n')) month=int(raw_input('month:\n')) day=int(raw_input('day:\n')) sum=0 months=(0,31,59,90,120,151,181,212,243,273,304,334) if 0<month<=12: sum=months[month-1] else: print 'data error!' sum+=day leap=0

  • python切片复制列表的知识点详解

    1.不指定开始和结束的索引[:],这样得到的切片就可以包含整个列表,然后给切片一个新的变量,从而实现复制列表. 2.创建原始列表的副本,两个列表的操作不会影响. 实例 names = ["Jerry", "Tom"] names_copy = names[:] names.append("Ann") names_copy.append("Bob") print(f"names:{names}") print

  • python复制列表时[:]和[::]之间有什么区别

    前言 new = old[:] Python老鸟都知道以上代码是什么意思.它复制列表old到new.它对于新手来说是种困惑而且应该避免使用这种方法.不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧.然而本文给大家介绍的是关于python复制列表时[:]和[::]之间有什么区别,下面来一起看看吧 我们可以(浅)使用[:]复制列表: l = [1, 2, 3] z1 = l[:] 我们也可以(浅)使用[::]复制它: z2 = [::] 现在z1 == z2将为Tru

  • 详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"

  • python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())

    目录 1.浅拷贝和深拷贝 2.直接赋值 3.for循环 4.切片 5.copy()方法 (1)list.copy()方法 (2)copy.copy()方法 6.deepcopy()方法 1.浅拷贝和深拷贝 浅拷贝复制指向某个对象的地址(指针),而不复制对象本身,新对象和原对象共享同一内存. 深拷贝会额外创建一个新的对象,新对象跟原对象并不共享内存,修改新对象不会影响到原对象. 赋值其实就是引用了原对象.两者指向同一内存,两个对象是联动的,无论哪个对象发生改变都会影响到另一个. 2.直接赋值 使用

  • Python 中判断列表是否为空的方法

    在判断列表是否为空时,你更喜欢哪种方式?决定因素是什么? 在 Python 中有很多检查列表是否是空的方式,在讨论解决方案前,先说一下不同方法涉及到的不同因素. 我们可以把判断表达式可以分为两个阵营: 对空列表的显式比较 对空列表的隐式求值 这意味着什么? 显式比较 我们从显式比较开始说起,无论我们使用列表符号 [] 还是声明空列表的函数 list() ,遵循的策略是查看待检查列表是否与空列表完全相等. # 都是用来创建空列表 a = [] b = list() print(a == b) #

  • 对python中执行DOS命令的3种方法总结

    1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. 使用Popen模块产生新的process 现在大部分人都喜欢使用Popen.Popen方法不会打印出cmd在linux上执行的信息.的确,Popen非常强大,支持多种参数和模式.使用前需要from subprocess import Popen, PIPE.但是Popen函数有一个缺陷,就是它是一个阻塞的方

  • python中调试或排错的五种方法示例

    前言 本文主要给大家介绍了关于python中调试或排错的五种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的的介绍吧 python调试或排错的五种方法 1.print,直接打印,比较简单而且粗暴 在代码中直接输入print+需要输出的结果,根据打印的内容判断即可 2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多 如下,直接将预期结果和实际结果做判断 def true_code(): x = 3 y = 2 z = x + y assert(5==z), "z

  • Python 中导入csv数据的三种方法

    Python 中导入csv数据的三种方法,具体内容如下所示: 1.通过标准的Python库导入CSV文件: Python提供了一个标准的类库CSV文件.这个类库中的reader()函数用来导入CSV文件.当CSV文件被读入后,可以利用这些数据生成一个NumPy数组,用来训练算法模型.: from csv importreader import numpy as np filename=input("请输入文件名: ") withopen(filename,'rt',encoding='

  • Python中提取人脸特征的三种方法详解

    目录 1.直接使用dlib 2.使用深度学习方法查找人脸,dlib提取特征 3.使用insightface提取人脸特征 安装InsightFace 提取特征 1.直接使用dlib 安装dlib方法: Win10安装dlib GPU过程详解 思路: 1.使用dlib.get_frontal_face_detector()方法检测人脸的位置. 2.使用 dlib.shape_predictor()方法得到人脸的关键点. 3.使用dlib.face_recognition_model_v1()方法提取

  • Python中寻找数据异常值的3种方法

    目录 1. 引言 2. 举个栗子 3. 孤立森林 4. 椭圆模型拟合 5. 局部异常因子算法 6. 挑选异常值检测方法 7. 异常值消除 8. 总结 1. 引言 在数据处理.机器学习等领域,我们经常需要对各式各样的数据进行处理,本文重点介绍三种非常简单的方法来检测数据集中的异常值. 2. 举个栗子 为了方便介绍,这里给出我们的测试数据集,如下: data = pd.DataFrame([ [87, 82, 85], [81, 89, 75], [86, 87, 69], [91, 79, 86]

  • Python中给List添加元素的4种方法分享

    List 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义的顺序(除非你对它们进行排序或其他修改操作). 在Python中,向List添加元素,方法有如下4种方法(append(),extend(),insert(), +加号) 1. append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型. 此元素如果是一个list,那么这个list将作为一个整体进行追加,注意append()和ext

  • Python创建空列表的字典2种方法详解

    如果要在 Python 中创建键值是空列表的字典,有多种方法,但是各种方法之间是否由区别?需要作实验验证,并且分析产生的原因.本文针对两种方法做了实验和分析. 如果要在 Python 中创建一个键值都是列表的字典,类似下面这样,该怎么做? {1:[], 2:[], 3:[], 4:[]} 方法1,字典构造器 用 dict 构造器生成,构造(key,value)对 > key = [1, 2, 3, 4] > a = dict([(k,[]) for k in key]) > a {1:

  • Python中list列表的一些进阶使用方法介绍

    判断一个 list 是否为空 传统的方式: if len(mylist): # Do something with my list else: # The list is empty 由于一个空 list 本身等同于 False,所以可以直接: if mylist: # Do something with my list else: # The list is empty 遍历 list 的同时获取索引 传统的方式: i = 0 for element in mylist: # Do somet

随机推荐