关于python浅拷贝深拷贝等常用知识解析
拷贝
直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
直接赋值
字典的直接赋值
b = a: 赋值引用,a 和 b 都指向同一个对象。
浅拷贝
>>>a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
深拷贝
深度拷贝需要引入 copy 模块:
>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
案例
以下实例是使用 copy 模块的 copy.copy( 浅拷贝 )和(copy.deepcopy ):
实例
#!/usr/bin/python
# -*-coding:utf-8 -*-
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
以上实例执行输出结果为:
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
关于赋值与浅拷贝的疑问
案例比较
赋值的案例
list1 = {'1':1,'2':2}
list2 = list1
list1['1'] = 5
sum = list1['1'] + list2['1']
print(sum)
sum = 10
python2,3: 列表和字典直接赋值是浅拷贝,浅拷贝情况下对其中一个的改变都会相应改变另一个
关于浅拷贝
kvps = { '1' : 1, '2' : 2 }
theCopy = kvps.copy()
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print sum
sum = 6
补充python可变不可变类型
可变数据类型:列表list[ ]、字典dict{ }
不可变数据类型:整型int、字符串str’ '、元组tuple()
python中的数据类型:整型,字符串,元组(只读列表,只能查询,不可更改),集合,列表,字典;
不可变数据类型:整型,字符串,元组;当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会改变;
可变数据类型: 集合,列表,字典;数据发生改变,但内存地址不变
Python中切片的问题
首先,理解a=range(100)是什么意识?
range(start, end, step),start:起始值;end:终值;step:步长,默认为1。
a:0、1、2、3、4、5、......99。
所以,
正索引范围为:a[0] -a[end-1],
即 a[0] = 0,a[1] = 1,......,依次类推;
负索引范围为:a[-1] -a[-end],
即 a[-1] = 99,a[-2] = 98,......,依次类推。
python关于虚数的概念
1、虚数不能单独存在,它们总是和一个值为0.0的实数部分一起构成一个复数
2、复数由实数部分和虚数部分构成
3、表示虚数的语法:real+imagej
4、实数部分和虚数部分都是浮点数
5、虚数部分必须有后缀j或J
复数的内建属性:
复数对象拥有数据属性,分别为该复数的实部和虚部。
复数还拥有conjugate方法,调用它可以返回该复数的共轭复数对象。
复数属性:real(复数的实部)、imag(复数的虚部)、conjugate()(返回复数的共轭复数)