首页 > 编程 > Python > 正文

浅析Python中的赋值和深浅拷贝

2020-02-16 02:04:29
字体:
来源:转载
供稿:网友

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 。

此时当B对象里面的内容发生更改的时候,A对象也自然而然的会跟着更改。

name = ["root","admin"]cp_name = name # 对cp_name进行赋值操作# 对name列表进行插入name.append('root_temp')print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']print(id(name),id(cp_name)) # 23991960 23991960

而想要进行浅拷贝或者深拷贝,就需要引入copy模块 。

首先来说下浅拷贝,当进行浅拷贝时,使用copy.copy()方法。

import copyname = ["root","admin"]# 进行浅拷贝操作cp_name = copy.copy(name)# 查看cp_name,nameprint(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷贝成功#查看地址print(id(name),id(cp_name)) # 21146920 21147160 内存地址并不相同# 尝试对name进行更改name.append('root_temp')# 查看cp_name是否更改print(cp_name) # ['root', 'admin'] 内容并没有更改

A = copy.copy(B) 此时A对象相当于把B对象中的内容给完成的拷贝了一份,存储在了一份新的内存地址当中。

其中有一点需要注意,如下:

import copyname = ['root','admin',['root_temp','admin_temp']]cp_name = copy.copy(name)# 查看两个对象的地址print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同# 对name 进行更改name.append('test')# 查看cp_name是否更改print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改# 在来对name中的列表对象进行更改name[2].append('ttttt')print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 发现cp_name内容发生了变化

在上面的代码中,通过copy.copy()方法把name对象浅拷贝给了cp_name,此时二者的内容相同,但是地址不同,说明通过浅拷贝后,cp_name相当于重新开辟了一块内存空间用来存储拷贝过来的内容。所以说,当name.append()第一次插入值的时候,cp_name对象没有变化,因为cp_name和name 处于两个不同的内存空间,是独立的。

而浅拷贝的问题在于,只能够拷贝第一层的内容,至于说第二层以及第三层或者第n层,对于浅拷贝来说都是无能为力的,只能简单的拷贝一份内存地址。

所以说,对于name 这个对象中,列表第一层发生更改,是不会影响cp_name的,而一旦更改了第二层或者第n层的内容,cp_name都会被影响,因为此时的cp_name对象里面子列表是与name的子列表共享相同的内存空间。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表