Python 列表赋值、浅拷贝、深拷贝-02

本文深入探讨Python中的列表拷贝机制,包括直接赋值、浅拷贝及深拷贝的区别,并通过实例展示了不同拷贝方式对原始数据的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

”’
关于python中列表、字典的深浅拷贝问题之前认识比较模糊,之前的笔记中其实只是区分了拷贝和赋值的问题,
今天以列表为例重新学习一下:
关于深浅拷贝和赋值的概念:
a.直接赋值: 用等号 = ,其实就是对象的引用
b.浅拷贝: 用copy( ),拷贝父对象,但是不会拷贝内部子对象
c.深度拷贝: 用deepcopy,是采用大模块copy中的deepcopy方法,完全拷贝父对象和子对象
”’

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


import copy

def print_all_list(a=[],b=[],c=[],d=[],e=[],f=[],log=''):
  print log
  print "a:", a
  print "b:", b
  print "c:", c
  print "d:", d
  print "e:", e
  print "f:", f

if __name__ == "__main__":
  a = [0,1,2,3,[4,5,6],[7,8,9]]
  b = a                        ## 直接赋值
  c = copy.copy(a)             ## 浅拷贝
  d = copy.deepcopy(a)         ## 深拷贝
  e = list(a)                  ## 待测试
  f = a[:]                     ## 待测试
  print_all_list(a,b,c,d,e,f,"初始:a为原列表,b为赋值,c为浅拷贝,d为深拷贝,e&f待测试")

  a.append([0,0,0])
  print_all_list(a,b,c,d,e,f,"给a添加了一个列表元素[0,0,0]")
  ## 可以看到直接赋值的b也发生改变了,说明:a.直接赋值——就是对对象的引用

  a[4].append(100)
  print_all_list(a,b,c,d,e,f,"对a索引为4的子对象[4,5,6]操作,增加一个元素100")
  ## 可以看到除直接赋值的情况外,浅拷贝的索引为4的子对象也发生了变化。
  ## 说明浅拷贝只拷贝父对象,但是不会拷贝内部子对象。对于父对象中的子对象只是进行索引。
  ## 而深拷贝,则是完全创建了一个新的列表。

  ##最终可以看到,e=list(a)、f=a[:]两种方式也是浅拷贝。

'''
输出
初始:a为原列表,b为赋值,c为浅拷贝,d为深拷贝,e&f待测试
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
给a添加了一个列表元素[0,0,0]
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
对a索引为4的子对象[4,5,6]操作,增加一个元素100
a: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]

'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值