一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
= 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
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. MVC基础篇—控制器与视图数据的传递

    Viewdata,Viewbag,Tempdata 1  Vewdata:简单来说就是数据字典,通过键值对的形式来存放数据.举例如下: //后台控制器代码: public ActionResult V ...

  2. [PHP] 算法-统计一个数字在排序数组中出现的次数的PHP实现

    统计一个数字在排序数组中出现的次数. 1.有序的数组查找,使用二分法 2.二分法查找第一次出现的位置,二分法查找最后一次出现的位置,end - start +1 left=getLeft(data,k ...

  3. SQL Server中的数据类型

    参考 SQL Server 2012编程入门经典(第4版) SQL Server 自带的数据类型 整型: 货币 近似小数 日期/时间 特殊数字 字符 Unicode 二进制 其他

  4. CSS之Normalize.css的使用(重置表)

    本文译自Normalize.css官网: http://nicolasgallagher.com/about-normalize-css/ Normalize.css 只是一个很小的CSS文件,但它在 ...

  5. React 入门学习笔记整理(二)—— JSX简介与语法

    先看下这段代码: import React from 'react'; //最终渲染需要调用ReactDOM库,将jsx渲染都页面中 import ReactDOM from 'react-dom'; ...

  6. Linux 下的 PostgreSQL 数据库+文件通用自动备份脚本

    由于 Odoo(原名 OpenERP)自 8.0 以来会生成 CSS,并把附件存储在文件系统中,因此以前单纯备份数据库的脚本已经不够用了.出于实际部署的考虑,我专门写了个较为通用的 Odoo 备份脚本 ...

  7. Android学习笔记----天地图API开发之UnsatisfiedLinkError

    由于在jniLibs目录下移除了x86的相关so文件,后来又因为需要在PC模拟器上调试,将该文件夹恢复后,增加了天地图的sdk,却忘记将libMapEngine.so文件同时拷贝至x86目录下,导致如 ...

  8. Linux 学习笔记之超详细基础linux命令 Part 13

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...

  9. TensorFlow深度学习入门

    # -*- coding: utf-8 -*- """ Created on Tue Oct 2 15:49:08 2018 @author: zhen "&q ...

  10. [20170623]利用传输表空间恢复数据库2.txt

    [20170623]利用传输表空间恢复数据库2.txt --//继续上午的测试,测试truncate,是否可行,理论讲应该没有问题.我主要的目的测试是否要切换日志.--//参考链接 : http:// ...