一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
= 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
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. element split 将多个单号分隔

    const condeid = this.formData.WayBillCode; var item = ""; const codes = condeid.split(&quo ...

  2. Tomcat报failed to parse the expression [${xxx}]异常(javax.el.ELException)的解决方法

    Tomcat 7 'javax.el.ELException' 的解决方式tomcat 7对EL表达式的语法要求比较严格,例如"${owner.new}"因包含关键字new就会导致 ...

  3. java数据写入Excel

    正好最近公司要写一个对账的功能,后台用java从银行获得对账信息,数据是json类型的,然后写入excel中发送给一卡通中心的服务器上,网上找了很多代码,然后整合和改正,代码如下. import ja ...

  4. canvas-star5.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Python知识点小记

    类 设置类属性必须使用类对象,若使用实例对象设置,会重新创建一个和类属性同名的实例属性 类对象可调用 类方法&静态方法, 实例对象可调用 实例方法&类方法&静态方法; 类方法和 ...

  6. Jetbrains IDE 中 compass sass 设置

    环境 Ubuntu 13.10 1. 安装ruby sudo apt-get install ruby 如果后面安装 compass 时遇到安装失败,提示:“[Ubuntu] ERROR: Faile ...

  7. Python基础二字符串和变量

    了解一下Python中的字符串和变量,和Java,c还是有点区别的,别的不多说,上今天学习的代码 Python中没有自增自减这一项,在转义字符那一块,\n,\r\n都是表示回车,但是对于不同的操作系统 ...

  8. 我的Java之旅 第三课 从Applet到JSP

    一.Applet   Applet是一种特殊的Java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行.   App ...

  9. ArcGIS JavaScript API动态图层

      矢量动态图层     <!DOCTYPE HTML> <html>   <head> <meta http-equiv="Content-Typ ...

  10. 自定义控件详解(三):Canvas效果变换

    Canvas 画布 从前面我们已经知道了 Canvas 类可以绘出 各种形状. 这里学习一下Canvas 类的变换效果(平移,旋转等) 首先需要了解一下Canvas 画布, 我们用Canvas.Dra ...