* 作者:煮酒品茶 tea
* 博客:http://www.zwhset.com http://cwtea.blog.51cto.com
* 目前在京峰教育担任python讲师
#0、知识介绍
* 原处修改(可变类型):python有些对象支持原处修改,即为对象内存本身可以进行增册改查等操作,而不改变内存地址(id号)。
* 常见可变类型:list dict
* 常见不可变类型:int str tuple
* 所以可变类型支持原处修改,而不可变类型不支持原处修改(id)号
* 拷贝:
**需要理解框子概念**
> 列表只是一个框子,里面装的水果(元素)只是一个个的内存引用地址(id)号,同样框子里面装的框子(嵌套列表)里面也只是一个引用地址,列表维护本身位置索引的关系。
a = [1,2,[3]] --> [] 1 2 [] 3具有如下几个引用地址 a维护[]的位置索引信息。
* 浅拷贝:对可变类型外层(顶层)数据进行拷贝,产生变化的是对象[]本身,[]内不可变类型id不变,[]内可变类型引用地址不变。所以只复制了[]本身。
* 深拷贝:对可变类型外层以及内层数据进行拷贝,实则不可变类型拷贝内存地址,可变类型新建内存地址。
#1、赋值引用
~~~
In [23]: a = []
In [24]: b = a # 赋值,实则为引用a对象的内存地址
In [25]: a.append(2) # 添加2元素到列表末尾
In [26]: a,b
Out[26]: ([2], [2]) #a b列表都有进行元素添加
~~~
#2、原处修改常见错误
~~~
In [1]: a = [1,2]
In [2]: #新手易对本地原处修改进行重复赋值
In [3]: a = a.append(3) #想在[1,2]后面增加一个3并赋值给a
In [4]: a # None a的原始结果都没有了
~~~
#3、浅拷贝
~~~
In [7]: a = [1,[2,3]] # 嵌套列表
In [8]: b = a[:] # b为a的浅拷贝
In [9]: a.append(4) # a添加4的元素,由于拷贝b并未添加
In [10]: a
Out[10]: [1, [2, 3], 4]
In [11]: b
Out[11]: [1, [2, 3]]
~~~
#4、浅拷贝内层可变列表还是引用
~~~
In [12]: a[1].append(5) # 对内层列表进行添加5的元素
In [13]: a # 列表a添加了,b也添加了
# a b内层列表值一样
Out[13]: [1, [2, 3, 5], 4]
In [14]: b
Out[14]: [1, [2, 3, 5]]
~~~
#5、深拷贝
~~~
In [15]: import copy #引用拷贝模块
In [16]: c = copy.deepcopy(a)
In [17]: a
Out[17]: [1, [2, 3, 5], 4]
In [19]: c
Out[19]: [1, [2, 3, 5], 4]
In [20]: a[1].append(6) # 内层列表添加元素6
# a c值已经不同
In [21]: a
Out[21]: [1, [2, 3, 5, 6], 4]
In [22]: c
Out[22]: [1, [2, 3, 5], 4]
~~~
#6、例子问题
~~~
lists = [1,2,3]
def for_list(lists):
for iter in lists:
# do something
~~~
**for_list(lists=lists) 还是for_list(lists=lists)进行浅拷贝呢?**
- python核心
- python27编译安装
- 原处修改以及拷贝
- loop
- 内置的变量
- 内置类型
- python内置方法
- 内置方法列表
- 求绝对值-abs
- 求商取余-divmod
- 交换输入-input
- [未完]文件打开函数-open
- staticmethod
- 判断迭代对象真假all
- 判断迭代对象真假any
- 枚举对象enumerate
- 整数转换类型int
- ascii码转换ord-chr-unichr
- 类型转换str
- python执行字符串表达式eval
- 类型判断isinstance
- 数学计算pow
- 数学计算和sum
- 不可变集合frozenset
- zip
- 比较cmp
- basestring类型判断
- 反转序列迭代器resversed
- python模块
- glob
- sys.argvgetopt-argparse
- os
- sys
- requests
- random
- time
- date
- zlib-gzip-bz2-zipfile-tarfile
- ftp
- paramiko
- pexpect
- 数据库模块
- redis
- mysql
- mongodb
- __builtin__
- 学生PYTHON分享
- 学生运维分享
