浅谈python的深浅拷贝
python中有两种数据类型:一种是可变数据类型,一种是不可变数据类型
不可变数据类型包括(整型及其他数据类型,字符串及元组)
可变数据类型(列表,集合,字典,类和类实例)
鉴定是否为拷贝还是只是引用计数加1,我们可以用python的内置函数(id())来验证.
s = ""
s1 = s
print(id(s),id(s1))

程序运行结果表明s和s1的内存地址是相同的,所以他们不属于拷贝,只是引用计数加1
下面我们来使用python的内置函数copy试一下看能否真正实现拷贝
s = [[1,2],3,4]
s1 = s.copy()
print(id(s),id(s1))

从上面的运行结果来看,好像是拷贝了一份s给s1,但是我们再看一段下面的程序
s = [[1,2],3,4]
s1 = s.copy()
s1[0][1] = 1
s1[1] = 1
print(s,s1)

通过运行上面的代码,我们可以看到,如果将原来s1下标为1的数字3改为1,s里面的不变,但是如果改变s1列表中的下标为0的列表元素里面的下标为1的数字,则原来的列表会改变。
为什么的?因为s列表里面的列表元素为可变数据类型,而python内置的函数copy虽然也是拷贝,但是只是拷贝原来变量中的不可变数据类型,可变数据类型只是引用加1,拷贝后和拷贝前变量中的可变数据类型的指针或者内存id是指向同一个地址或内存的。
这就能解释为什么改变拷贝后的变量里面的可变数据类型会导致原来的变量里面的数据改变,我们称这种拷贝为浅拷贝。
既然上面称之为浅拷贝,相对的也就有深拷贝,深拷贝能实现什么呢?能否实现我们认知观念中的那种拷贝形式?看下面代码
import copy
s = [[1,2],3,4]
s1 = copy.deepcopy(s)
s1[0][1] = 1
s1[1] = 1
print(s,s1)

为了能实现深拷贝,我们首先需要引入一个copy模块,从运行结果可以看出来,无论是改变拷贝后的可变数据类型还是不可变数据类型,都不会导致原来变量中的数据改变,以上的方法我们成为深拷贝!
浅谈python的深浅拷贝的更多相关文章
- 开发技术--浅谈python数据类型
开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- Python原理 -- 深浅拷贝
python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- Python的深浅拷贝
Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
- 浅谈Python中的深浅拷贝的区别
深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...
随机推荐
- 关于vue项目多页面的配置
基于vue2.0生成项目,一段时间都在找如何配置成多个页面的.网上有这样的例子相对也是比较详细的,但是还是有些许不一样的地方的.所以,我还是记录下来,当然我也是参考了网上的资料的. 当然先来个vue的 ...
- selenium+Node.js在windows下的配置和安装
转载:http://www.jianshu.com/p/5e64bb70abb8
- P3321 [SDOI2015]序列统计 FFT+快速幂+原根
\(\color{#0066ff}{ 题目描述 }\) 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这 ...
- Python内置函数、作用域、闭包、递归
1.几个可能用到的内置函数 2.函数内变量的作用域 3.内嵌函数和闭包 4.递归函数 1.常见的内置函数 常见的内置函数: 查看内置函数: print(dir(__builtins ...
- aspectj 与 spring 自定义注解
** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ @Target({ElementType.METHOD}) @Retent ...
- void类型指针的基本用法
void作为指针时可以用任意类型的的指针值都可以给它进行赋值和传递,但是输出时必须时显性输出 代码如下: #include<cstdio> #include<iostream> ...
- B. Sereja and Suffixes
B. Sereja and Suffixes time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Go语言基础之14--Waitgroup和原子操作
一.Waitgroup介绍 1.1 背景 package main import ( "fmt" "time" ) func main() { ch := ma ...
- 服务器运行两个或两个以上的tomcat
一:解决方法 转载: https://www.cnblogs.com/xiaobai1226/p/7662392.html 二:解决方法 将tocmat下 bin---->tomcat8w.e ...
- linux 文件 s 权限
s权限的作用:表示对文件具用可执行权限的用户将使用文件拥有者的权限或文件拥有者所在组的权限在对文件进行执行. s权限的设置:4,用户拥有者的执行权限位, 6,用户组的执行权限位, 2, 两者都设置, ...