核心提示:

可变类型 Vs 不可变类型

可变类型(mutable):列表,字典

不可变类型(unmutable):数字,字符串,元组

这里的可变不可变,是指内存中的那块内容(value)是否可以被改变

代码:

name1='wupeiqi'name2=name1print("name1:%s\nname2:%s" %(name1,name2))

name1='alex'

print("I have assigned new value to name1.Let's see what happens to name2!")print("name1:%s\nname2:%s" %(name1,name2))

执行结果:

C:/Personal/OldboyPython/day01/test.py

name1:wupeiqi

name2:wupeiqi

I have renamed name1 to new_name.Let's see what happens!

name1:alex

name2:wupeiqi

疑问:为什么name2的值没有和name1一起变为alex?下面开始解答,先看图,后解释。

以下引用自http://www.cnblogs.com/wupeiqi/articles/5433925.html

变量的赋值

#!/usr/bin/env python

# -*- coding: utf-8 -*-

name1 = "wupeiqi"

name2 = "alex"

#!/usr/bin/env python

# -*- coding: utf-8 -*-

name1 = "wupeiqi"

name2 = name1 # 使name2和name1指向同一个对象 赋值,只是创建一个变量,该变量指向原来内存地址,

以上引用自http://www.cnblogs.com/wupeiqi/articles/5433925.html

1.引用计数的增减

当对象wupeiqi(图中蓝色的内存区块wupeiqi)被初次创建并(将其引用)赋值给变量name1时,对象wupeiqi的引用计数被设置为1。

当对象alex(图中蓝色的内存区块alex)被初次创建并(将其引用)赋值给变量name2时,对象alex的引用计数被设置为1。

当变量name1赋值给变量name2(name2=name1),实际是把对象wupeiqi赋值给name2,因此对象wupeiqi的引用计数自动加1,而对象alex的引用计数自动减1,即减为0,触发垃圾回收机制。

2. 可变类型 Vs 不可变类型

可变类型(mutable):列表,字典

不可变类型(unmutable):数字,字符串,元组

这里的可变不可变,是指内存中的那块内容(value)是否可以被改变。如果是不可变类型,在对对象本身操作的时候,必须在内存中新申请一块区域(因为老区域#不可变#)。如果是可变类型,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。

可以使用内建函数id()来确认对象的身份在两次赋值前后是否发生了变化。示例可参看http://blog.chinaunix.net/uid-26249349-id-3080279.html

*不可变类型有什么好处?如果数据是不可变类型,当我们把数据传给一个不了解的API时,可以确保我们的数据不会被修改。如果我们要操作一个从函数返回的元组,可以通过内建函数list()把它转换成一个列表。(当被问到列表和元组的区别时,可以说这一点!)

3. 深拷贝 Vs 浅拷贝

copy.copy() 浅拷贝

copy.deepcopy() 深拷贝

浅拷贝是新创建了一个跟原对象一样的类型,但是其内容是对原对象元素的引用。这个拷贝的对象本身是新的,但内容不是。拷贝序列类型对象(列表\元组)时,默认是浅拷贝。

以下引用自http://www.cnblogs.com/wupeiqi/articles/5433925.html

赋值,只是创建一个变量,该变量指向原来内存地址,如下例:

n4 = n3 = n2 = n1 = "123/'Wu'"

关于赋值,再看一个字典的例子:

n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}

n2= n1

浅拷贝,在内存中只额外创建第一层数据,如下图

importcopy

n1= {"k1": "wu", "k2": 123, "k3": ["alex", 456]}

n3= copy.copy(n1)

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化),如下图:

importcopy

n1= {"k1": "wu", "k2": 123, "k3": ["alex", 456]}

n4= copy.deepcopy(n1)

python可变类型和不可变深浅拷贝类型_理解python可变类型vs不可变类型,深拷贝vs浅拷贝...相关推荐

  1. 【Python】Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型

    本文是Python实战–从入门到精通系列的第一篇文章: Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 文章目录 1.变量 1.1 变量命名规则 1.2 变量名称错误 ...

  2. python自定义函数复制字符串_Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝...

    python中的对象和类型 在python中,认为系统中的每一个"东西"都是一个对象,在python中,"对象"有着特殊的意义,python中的对象有: 一个标 ...

  3. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  4. 21天学通python电子版-小数据池,深浅拷贝,集合+菜中菜

    小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异. 那么到底什么是小数据池?他有什么作用呢? 前提条 ...

  5. python深浅拷贝 面试_[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝

    内存管理相关的面试一直是面试中的重点考察内容.赋值.深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点.不小心可是会写出bug哦- 赋值 先来看一段代码,下面两段代码的输出结果会是什么呢? # ca ...

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

    深浅copy 和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念 ...

  7. 什么是python语言的动态类型机制_理解Python的Dynamic typing

    Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...

  8. python结构体数组传出接收c动态库_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  9. python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝

    Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...

最新文章

  1. 为了提高工作效率:通过pycharm的模板代码减少重复工作
  2. #Apache Spark系列技术直播# 第六讲【 What's New in Apache Spark 2.4? 】
  3. qtablewidget 数据量大效率很低_让大牛带你走进大数据分析:R基础及应用的潮流尖端,享受RHadoop...
  4. CUBLAS_STATUS_ALLOC_FAILED
  5. boost::timer模块timer、job_timer和progress_display示例程序
  6. 树莓派python串口中文输出_Python实现树莓派USB串口通讯
  7. 致毕业生:那些年我们错过的“BAT”
  8. centos 获取硬件序列号_如何在 Linux 上查找硬件规格
  9. java Web监听器导图详解
  10. WebSocket实战之————GatewayWorker使用笔记例子
  11. .NET下数据访问层+webform前台 技术大比拼
  12. Java 1.1.8 构建字符串
  13. jQuery.noConflict() 解决冲突 原理深入
  14. ultraedit查找每行第二个单词_算法4th3:查找
  15. oracle怎么恢复删除数据库数据库文件,Oracle只有数据文件恢复数据库
  16. SAP固定资产业务配置及操作手册
  17. VSCode下载安装教程(Windows 10)
  18. ADM2587E外围电路设计
  19. 计算机管理里面和打印机相关的,打印机设备
  20. 北京新房成交10月下旬暴增 二手房均价年内首次微涨

热门文章

  1. C语言x86汇编指令理解volatile(三十五)
  2. 一个简单的Hook demo
  3. Android addr2line和 c++filt使用
  4. wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
  5. Android 匿名共享内存Java接口分析
  6. 《C关键字分析》之extern用法
  7. netcore 之docker
  8. resiprocate 之repro使用
  9. 深度学习自学(二十二):人脸检测人脸识别-嵌入式平台方案汇总
  10. linux on android 项目,好累,终于完成了 Android-on-Yeeloong 项目的搭建