一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
= 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
old_lst = [1, 2, 3]
new_lst = old_lst
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

32645384
32645384
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3, 666]

二、 浅拷贝:copy浅拷贝,只拷贝一层内容,复制一个表面,更深层次的内容,只拷贝一个内存地址。浅拷贝可以通过两种方式实现,一种是切片赋值,一种是copy()函数

拷贝的意义:快速的创建对象

1.1.列表切片赋值 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)

old_lst = [1, 2, 3]
new_lst = old_lst[:]
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

43655432
43656456
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]

1.2.列表切片赋值 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)

old_lst = [1, [2, 3]]
new_lst = old_lst[:]
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

43524296
43525384
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3, 666]]

2.1.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)

old_lst = [1, 2, 3]
new_lst = old_lst.copy()
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

43524360
43525384
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]

2.2.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)

old_lst = [1, [2, 3]]
new_lst = old_lst.copy()
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

43720904
43721992
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3, 666]]

三、深拷贝:把内容完全的复制一份

import copy

copy.deepcopy()

两个列表的内存地址不一样,两个列表没有任何的关联了

1.1(简单的列表,列表元素不包括列表类型)

import copy
old_lst = [1, 2, 3]
new_lst = copy.deepcopy(old_lst)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

37430600
37446088
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]

1.2(复杂些的列表,列表元素包括列表类型)

import copy
old_lst = [1, [2, 3]]
new_lst = copy.deepcopy(old_lst)
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)

执行结果:

43787592
43804168
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3]]

四、函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)(不可变参数:str bool int tuple

1.1 实例一

def func(lst=[]):
lst.append(123)
print(id(lst), lst) func()
func()
func()

执行结果:

36175624 [123]
36175624 [123, 123]
36175624 [123, 123, 123]

1.2 实例二

函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)

def func(lst=[]):
lst.append(123)
print(id(lst), lst) func()
func([])
func()

执行结果:

43384584 [123]
43394440 [123]
43384584 [123, 123]

python3 列表的赋值和深浅拷贝的更多相关文章

  1. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  2. 【python】变量的赋值、深浅拷贝

    python——赋值与深浅拷贝 https://www.cnblogs.com/Eva-J/p/5534037.html 啥都不说,看这个博主的文章!

  3. python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典

    深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...

  4. python--关于赋值与深浅拷贝的认识

    作为一个自学python的小白,平时用到深浅拷贝的机会很少,因此对其也是一知半解.但是,作为一个立志成为后端工程狮的男人,眼里揉不了沙子,于是专门花时间补了补课,在此记录一下学习心得.    在讲深浅 ...

  5. python直接赋值、深浅拷贝实例剖析

    根据数据类型分为两部分进行剖析: int.str类型      list.tuple.dict类型等 1.  int.str类型 [int类型实例] >>> import copy ...

  6. python中的“赋值与深浅拷贝”

    Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...

  7. python语法基础-基础-赋值与深浅拷贝

    ##################################### 预备知识一——python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时 ...

  8. python3【基础】-赋值与深浅拷贝

    一.Python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址, ...

  9. python列表中的赋值与深浅拷贝

    首先创建一个列表 a=[[1,2,3],4,5,6] 一.赋值 a=[[1,2,3],4,5,6]b=aa[0][1]='tom'print(a)print(b)结果: [[1, 'tom', 3], ...

随机推荐

  1. 【常用配置】Hadoop-2.6.5在Ubuntu14.04下的伪分布式配置

    core-site.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet t ...

  2. JS如何判断一个数组是否为空、是否含有某个值

    一.js判断数组是否为空 方法一:  arr.length let arr = []; if (arr.length == 0){ console.log("数组为空") }els ...

  3. blfs(systemv版本)学习笔记-制作一个简单的桌面系统

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 大概思路: lfs(系统)+xorg(驱动)+i3-wm(窗口+桌面)+lightdm(显示管理器+登录管理器) 链接: lfs ...

  4. 2018-02-06 编程猫IDE体验:对Scratch的改进

    前两天偶遇编程猫推介(为什么没有中文的编程?), 第一眼感觉像Scratch, 求证之下确实, 并且据说有改良. 今天非常粗浅地尝试一下, 限于水平没有做出很炫的效果, 不过颇有些发现. 首先上最终效 ...

  5. 【代码笔记】Web-HTML-框架

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. 【读书笔记】iOS-iOS的UI自动化测试

    1,Instruments iOS自带的自动化测试工具. 2,TuneupJs  最早的iOS自动化测试工具 https://github.com/alexvollmer/tuneup_js 3,yn ...

  7. sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!

          在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看:       有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth( ...

  8. Kotlin入门(1)搭建Kotlin开发环境

    Kotlin做为一门编程语言,已经出现好几年了,但此前在国内并不闻名.自从5月份谷歌宣布它成为Android的官方开发语言之后,Kotlin猛然窜红了,虽说短期内Kotlin无法取代Java,但对于一 ...

  9. 在centos7 上部署 vuepress

    vuepress是一款十分优秀简洁的文档生成器,可以根据目录下的md文档自动生成对应的html文件,界面简洁大方.每一个由 VuePress 生成的页面都带有预渲染好的 HTML,也因此具有非常好的加 ...

  10. CentOS7的/tmp目录自动清理规则

    CentOS6以下系统(含)使用watchtmp + cron来实现定时清理临时文件的效果,这点在CentOS7发生了变化. 在CentOS7下,系统使用systemd管理易变与临时文件,与之相关的系 ...