文档章节

Python的mutable值碎碎念

守恒的猫
 守恒的猫
发布于 2017/04/10 10:16
字数 658
阅读 5
收藏 0
点赞 0
评论 0

如下案例:

>>> def test(a, b=[]):
...     b.append(a)
...     return b

>>> test(1)
[1]
>>> test(2)
[1, 2]
>>> test(3)
[1, 2, 3]

 

是由于对于python的可变类型list,set,dict等,它的关键字变量默认值是在函数定义的时候存在func_defaults里的,又因为可变类型是传引用,因此每一次调用都是变化的。

 

[另一方面,在嵌套函数中,python2的内层函数无法获取外层函数不可变变量,但可以访问可变变量,因此通常这样写

def test():

    a = [1]

    def t():

        print a[0]

    t()

把变量放在一个mutable里]X

这里有一个严重失误,像这样的闭包,python内存函数是可以访问外层的变量的,但对immutable变量不允许修改,外面有个a=1,里面可以print a,可以a=2,但不允许a += 2,之前的“无法获取”是错误的,谨记!!!

——————————————————————————————————————————————

说到mutable,一个值得探讨的问题就是copy和deepcopy。通常来说一个浅拷贝只拷贝可变参数的引用,当原数据发生修改时拷贝数据也会修改,考虑如下case:

>>> a = [1,2,[12]]
>>> b = a
>>> a = [2,3,[23]]
>>> a
[2, 3, [23]]
>>> b
[1, 2, [12]]

嘿?说好的同时修改呢?

实际上是因为a进行了一个赋值操作而非对象内的数据修改,因此指向了另外一片内存。浅拷贝的case如下:

>>> a = [1,2,[12]]
>>> b = a
>>> a[1] = 3
>>> a[2].append(3)
>>> b
[1, 3, [12, 3]]
>>>

对于序列来说,会发生浅拷贝的情况有切片,工厂函数list()和copy模块等。

深拷贝顾名思义是整个复制重开内存,这里不再赘述,不过有一点,python对于不可变变量,深拷也是直接拷引用的,反正不可变,节省空间~case如下:

>>> c = 1
>>> d = deepcopy(c)
>>> id(c),id(d)
(140569092332408, 140569092332408)

要特别注意元组类型,考虑如下case:

>>> a = (1,2)
>>> b = deepcopy(a)
>>> id(a),id(b)
(4482226008, 4482226008)
>>> a = (1,[12])
>>> b = deepcopy(a)
>>> id(a),id(b),id(a[0]),id(b[0]),id(a[1]),id(b[1])
(4482223208, 4482225792, 140569092332408, 140569092332408, 4482452008, 4482450280)

 

当元组数据均为immutable时,深拷是拷引用

当数据中有mutable时,深拷回开辟新内存,其中,immutable的变量指向同一处,mutable的指向不同处

另外,当元组中有可变数据进行浅拷时,可变数据修改也会同时发生。

————————————————————————————————————————————

immutable数据是可以自定义的,只要重写继承的object的__setattr__和__delattr__

 

  1. class Immutable(object):  
  2.     def __setattr__(self, *args):  
  3.         raise TypeError("can't modify the value of immutable instance")  
  4.   
  5.     __delattr__ = __setattr__  
  6.   
  7.     def __init__(self, value):  
  8.          super(Immutable, self).__setattr__("value", value)  

© 著作权归作者所有

共有 人打赏支持
守恒的猫
粉丝 4
博文 30
码字总数 16159
作品 0
房山
Python3开发随记(2)实例

<碎碎念> 今天在公司终于把jQuery搜索插件的功能写完了,已经能实现同步GET提交查询参数并正确显示视图,重构了三遍自己才觉得代码凑合能看,和高手还是有距离的,继续努力吧。 晚上继续看P...

hosealee
2016/04/13
98
0
Waston+Python,6行代码实现音频转文字,轻松做字幕~

几行代码,抱上IBM爸爸大腿,实现音频快速转文字~用到了IBM Waston的Speech to text(目前还是个demo) 碎碎念的废话~ 前几天工作中遇到需要把音频转为文字稿的任务,顺便学了个新词语:扒词...

莉莉安的向日葵
04/27
0
0
理解 Python object 的 mutable 和 immutable

在 Python 的世界里,一切皆对象,每个对象各包含一个 idendity、type 和 value。 identity: 可理解为 object 的内存地址空间,其值可由 id() 函数获取,一旦 object 被创建,其 identity 将...

koala bear
2013/08/14
0
0
Python3开发随记(3)数据类型

<碎碎念> 上一个话题暂时不写了,直接写代码不好,还是先从基础开始吧 </碎碎念> Python3开发随记(3)数据类型 从这篇开始还是先看基础吧,直接看代码不好,另外我是一边看书一边写笔记的,...

hosealee
2016/04/17
72
0
动态规划法(六)鸡蛋掉落问题(一)(egg dropping problem)

  继续讲故事~~   这天,丁丁正走在路上,欣赏着路边迷人的城市风景,突然发现前面的大楼前围了一波吃瓜群众。他好奇地凑上前去,想一探究竟,看看到底发生了什么事情。   原来本市的一...

jclian91
06/05
0
0
SWIG入门3: C/C++初级特性

众所周知,SWIG这个项目建立的原因,是为大家提供简洁而又自然的脚本语言接口。什么是简洁而自然呢?它的意思就是C/C++的函数就直接被封装为python的函数,class就被封装成python的class。 ...

costaxu
2012/08/11
0
2
Python的函数参数传递:传值?引用?

作者:winterTTr (转载请注明) 我想,这个标题或许是很多初学者的问题。尤其是像我这样的对C/C++比较熟悉,刚刚进入python殿堂的朋友们 。C/C++的函数参数的传递方式根深蒂固的影响这我们的...

icheer
2014/02/26
0
3
SWIG入门4: C/C++初级特性2

1 structure 我看来,structure乃是封装之源。SWIG对于strucure的封装非常自然。自然的意思就是,C语言里怎么用PYTHON就怎么用。水里水里来,火里火里去。不过第一个问题就是,PYTHON作为面向...

costaxu
2012/08/18
0
1
Python3开发随记(1)关键要素

<碎碎念> 2月换了工作,由于工作原因学习了一些Python的基础,一开始在网上看了廖雪峰老师的Python2.7的教程,自己试着写了一些代码,突然发现越写越上瘾,然后想好好学习一下,所以买了Pyt...

hosealee
2016/04/09
67
0
Python实现MaxCompute UDF/UDAF/UDTF

MaxCompute 的 UDF 包括:UDF,UDAF 和 UDTF 三种函数,本文将重点介绍如何通过 Python实现这三种函数。 参数与返回值类型 参数与返回值通过如下方式指定: @odps.udf.annotate(signature) ...

隐林
2017/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio源码分析之pilot-discovery模块分析

本文分析的istio代码版本为0.8.0,commit为0cd8d67,commit时间为2018年6月18日。 本文为Service Mesh深度学习系列之一: Service Mesh深度学习系列part1—istio源码分析之pilot-agent模块分...

xiaomin0322
8分钟前
0
0
数据库基本操作:增删改查及联表操作

所用软件:SQL Server Management Studio 首先第一步,建立一个表。在这里命名为T1。并在里面填入几条数据。如图: T1 一.查询 查询所有:select * from T1; 按条件查询:select * from T1 ...

小_橙_子
12分钟前
0
0
Crontab作业时间设置

今天,遇到这么一个题目,周一到周五的9:00-16:59之间,每隔两分钟将某个命令运行一次。给的答案是: */2 9-16 * * 1-5 /usr/sbin/somecommand dosomething 乍一看,这个答案不对,应...

大别阿郎
17分钟前
0
0
ES17-JAVA API文档管理

1.保存文档 可以通过json工具把java对象转换成json字符串进行保存,也可以通过内置的帮助类直接构建json格式 /** * 获取客户端 * * @return */public static TransportClie...

贾峰uk
18分钟前
0
0
Python代码规范和命名规范

前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 一、简明概述 1、编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头...

blackfoxya
20分钟前
0
0
联动滑动之一:NestScrollChild和NestedScrollingParent

NestScrollChild和NestedScrollingParent 吐槽一下开源中国竟然标题字数有限制 由于项目中使用了CoordinateLayout来解决联动以及实现炫酷的UI效果,那么必须就要研究一波源码了,毕竟知其然知...

JerryLin123
38分钟前
1
0
cloudera spark2.2 读写hbase

cloudera spark2.2 读写hbase 例子 host = 'bigdata-03,bigdata-05,bigdata-04'conf = { "hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": "student1"}k......

osenlin
42分钟前
0
0
数据库规范化

转载自 一个小时学会MySQL数据库 地址:http://www.cnblogs.com/best/p/6517755.html 截取其中 1.4 部分 用于自己学习使用 感谢作者:张果 1.4、数据库规范化 经过一系列的步骤,我们现在终于...

十万猛虎下画山
43分钟前
0
0
ios逆向之工具篇

Reveal:查看任意app的UI结构 注:1.不越狱的手机,可以用Reveal来查看自己app的UI结构,不能查看其它app的结构。 2.越狱手机上可以查看任意app的UI结构。 IDA:反编译工具 从App Store下载的...

HeroHY
44分钟前
0
0
EOS区块链平台智能合约示例HelloWorld

我们将介绍一个使用EOS智能合约构建hello World的例子。 一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。 运行nodeos 要通...

笔阁
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部