https://www.cnblogs.com/LetMe/p/6724555.html

在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的;

变量的类型是分值引用与地址引用两种.

python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。

在Python中,是有多种数据类型:bool、int、long、float、string、list、dict、tuple、set;

其中可分为基本数据类型和复杂数据结构;

基本数据类型:bool、int、long、float、string;

复杂数据结构:list、dict、tuple、set;(对于能存储基本数据类型的变量可以把它看做复杂数据结构)

由于Python中的变量存储都是地址引用,所以说复杂数据结构(list、dict、tuple、set)中存储的变量也仅仅是变量的地址。

一、变量的初始化(赋值):

1.Python中变量的初始化就是在内存中新开辟一块存储变量的值的内存,把这块内存的地址赋值给变量。(变量中存的是值的地址)

 1 >>> str_1 = 'abc'
2 >>> id(str_1)
3 4300773168
4 >>> str_2 = str_1
5 >>> id(str_2)
6 4300773168

在给已经初始化的变量重新初始化的时候,就会重新更改变量中的地址。

1 >>> str_1 = 123
2 >>> id(str_2)
3 4300773168
4 >>> id(str_1)
5 4297541792

2.而在复杂数据结构中,更改数据结构中的元素(基本数据类型),仅仅是改变了这个元素的地址,而不会影响复杂数据结构本身的地址。

1 >>> list_1 =[1,2,3]
2 >>> id(list_1)
3 4320183368
4 >>> list_1.append(9)
5 >>> list_1[2] = 22
6 >>> list_1.pop(2)
7 3
8 >>> print(list_1,id(list_1))
9 [1, 2, 22, 5, 6, 9] 4320183368

通过上边的事例做出结论:

  当复杂数据结构(list、dict、tuple、set)赋值时,是在计算机中开辟一块内存来存储这个复杂数据结构的值,而修改其中元素的时候只是更改了复杂数据结构的元素的地址,不会影响复杂数据结构的地址(就像一个桌子上有坐着两个人,而桌子上的菜两个人是共同享有);当重新赋值时,会重新开辟新的内存来存储变量的值,把这块内存的地址存到变量中。(相当于桌子上的一个人移到了另一个桌子上吃)

二、拷贝:

  在Python中,我们有时候要保存一份数据,再去对这块数据进行处理,而这个时候Python提供了两种拷贝方式:浅拷贝、深拷贝。

1.浅拷贝

  浅拷贝: 不管是多么复杂的数据结构,浅拷贝只会拷贝第一层.

1 import copy
2 list_1 = [1,2,['a','b','c'],3]
3 list_2 = list_1[:]
4 # list_2 = copy.copy(list_1)浅拷贝的另一种方式
5 list_1[2][1] = 'kk'
6 print(list_1,list_2,id(list_1[2]),id(list_2[2]))
7 [1, 2, ['a', 'kk', 'c'], 3] [1, 2, ['a', 'kk', 'c'], 3] 4330513736 4330513736

由于浅拷贝只会拷贝list_1的第一层,所以元素中的list的地址没有被更改,说明list_1和list_2共享同一个第二层的list。

2.深拷贝:

  深拷贝会完全复制原变量的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量。

1 import copy
2 list_1 = [1,2,['a','b','c'],3]
3 list_2 = copy.deepcopy(list_1)
4 list_1[2][1] = 'kk'
5 print(list_1,list_2,list_1[2],list_2[2])
6 [1, 2, ['a', 'kk', 'c'], 3] [1, 2, ['a', 'b', 'c'], 3] 4330513736 4330512584

Python中变量、赋值、浅拷贝、深拷贝的更多相关文章

  1. python 中的 赋值 浅拷贝 深拷贝

    1.对象的赋值 都是进行对象引用(内存地址)传递,即 b is a ,a 变 b也变 2.浅拷贝 会创建一个新的对象,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址) 当我们使用下面的操作 ...

  2. Python中的赋值、深拷贝与浅拷贝(内存地址)

    Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...

  3. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  4. python中变量的命令规制及变量的赋值方式

    文章结构:              一.python中变量的命名规则             二.变量赋值的三种方式             三.python的垃圾回收机制 一.Python中变量的 ...

  5. Python中的赋值和拷贝

    赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.比如: >>> a=[1,2,3] >>> b=a >>> c= ...

  6. python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递

    ---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...

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

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

  8. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  9. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

随机推荐

  1. 编译安装vsftpd-3.0.2

    编译安装vsftpd 首先下载源码包(我一般喜欢放在/home/test) 解压:tar -zxvf vsftpd-3.0.2.tar.gz 进入目录进行编译 cd vsftpd-3.0.2 编译之前 ...

  2. 20145122《Java面向对象程序设计》实验二实验报告

    实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 PSP时间 步骤 ...

  3. P3386 【模板】二分图匹配 -网络流版

    二分图匹配 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+ ...

  4. 【第十八章】 springboot + thymeleaf

    代码结构: 1.ThymeleafController package com.xxx.firstboot.web; import org.springframework.stereotype.Con ...

  5. bootstrap datarangepicker如何使用

    本文为博主原创,未经允许不得转载: 下载资源文件: 地址:Github:https://github.com/dangrossman/bootstrap-daterangepicker/ 1.页面引用 ...

  6. javascript版的quine程序-返回自身源码

    引用自Wikipedia: 一个quine是一个计算机程序,它不接受任何输入,且唯一的输出就是自身的源代码. @cowboy (Ben Alman) 给出了一个用JavaScript写的quine程序 ...

  7. xss脚本注入后端的防护

    1.脚本注入最主要的是不要相信用户输入的任何数据,对数据进行转义 可以使用:org.springframework.web.util.HtmlUtils包中的 HtmlUtils.htmlEscape ...

  8. Java的八种基本类型:(按字节来分)

    Java的八种基本类型:(按字节来分) boolean   布尔型   1个字节 8bit(8位) byte     字节类型   1个字节 char     字符类型   2个字节 short    ...

  9. js 数组的删除

    var test=[1,2,1,2,3,4,5,6,7]; 1.remove test.remove(1)     位置 test.remove(-2) test.remove(2,3) 2 dele ...

  10. Java知识集锦

    Java知识集锦 一.Java程序基础 1.1 开发和运行环境 1.2 Java语言概述 二.Java语法基础 2.1 基础类型和语法 2.2 对象和类型 2.3 包和访问控制 三.数据类型及类型转换 ...