Python的对象及深浅拷贝

python的变量

在 Python 中,变量都是指针;指针的内存空间与数据类型无关,其内存空间保存了指向数据的内存地址。
描述

💬注意:在 C 中,当定义一个变量后,编译器就一定会给该变量分配内存,后续对该变量的读写是通过该内存地址实现的;而在 Python 中,只会给对象分配内存。

python的对象

在 Python 中,一切皆对象,主要由以下部分组成:

identity(ID):标识对象的“内存地址”,可使用 id(obj) 获取(唯一标识)
type(类型):标识对象的“类型”,可使用 type(obj) 获取
value(值):标识对象的“值”,可使用 print(obj) 获取

💬注意:对象的本质是一个内存块。

💬注意:变量无类型,对象有类型;变量位于栈内存,对象位于堆内存。

可变对象与不可变对象的理解:

可变对象:list(列表)、set(集合)、dict(字典),具有以下特性:

  • 不可 hash(可变长度)
  • 支持增删改查

不可变对象:bool(布尔)、int(整数)、float(浮点数)、str(字符串)、tuple(元组)、frozenset(不可变集合),具有以下特性:

  • 支持 hash(可变长度)、支持查询
  • 不支持增删改

1、声明对象

声明对象时,对于可变对象,会分配新的空间;对于不可变对象,相同值存储于同一空间中。
(1)可变对象

a=[1, 5]
b=[1, 5]
print(id(a))
print(id(b))
2293112497344
2293112519488

(2)不可变对象

a=1
b=1
print(id(a))
print(id(b))
2293005642032
2293005642032

2、修改值

修改值时,对于可变对象,修改值会修改当前空间的值,不会重新分配空间;对于不可变对象,修改值会分配新的空间。
(1)可变对象:

a=[1,2,5]
print(id(a))
a.append(8)
print(id(a))
print(a)
1914135759360
1914135759360
[1, 2, 5, 8]

(2)不可变对象:

a=1
b = a+1  # 如果是a = a+1,则新的a会覆盖旧的a
print(id(a))
print(a)
print(id(b))
print(b)
2183033481520
1
2183033481552
2

3、直接赋值及深浅拷贝

直接赋值:对象的引用。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。重新分配一块内存,存储原对象的父对象,原对象内部的子对象依然是引用原对象的。
深拷贝(deepcopy): 完全拷贝了父对象及其子对象。重新分配一块内存,将原对象中的元素,以递归的方式复制到新对象,因此新对象和原对象没有任何关联。

(1)直接赋值
b = a: 赋值引用,a 和 b 都指向同一个对象。
描述

(2)浅拷贝
b = a.copy():浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
描述
(3)深拷贝
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
描述
实例:

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']])

引用文章:
http://t.csdn.cn/5kqR2
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的拷贝和浅拷贝是用于复制对象的两种不同方式。 浅拷贝是创建一个新的对象,该对象与原始对象共享内部数据的引用。换句话说,浅拷贝只复制了对象的引用,而不是实际的数据。这意味着如果原始对象中的数据发生变化,浅拷贝对象也会受到影响。 Python中可以使用copy模块的copy()函数来进行浅拷贝。另外,对于可变对象(如列表、字典等),还可以使用切片操作或者工厂函数(如list()、dict()等)来进行浅拷贝。 以下是浅拷贝的示例代码: ```python import copy # 列表的浅拷贝 list1 = [1, 2, [3, 4]] list2 = copy.copy(list1) list1[2][0] = 5 print(list1) # 输出:[1, 2, [5, 4]] print(list2) # 输出:[1, 2, [5, 4]] # 字典的浅拷贝 dict1 = {'a': 1, 'b': [2, 3]} dict2 = copy.copy(dict1) dict1['b'][0] = 4 print(dict1) # 输出:{'a': 1, 'b': [4, 3]} print(dict2) # 输出:{'a': 1, 'b': [4, 3]} ``` 拷贝是创建一个新的对象,该对象与原始对象完全独立,包括内部数据的引用。换句话说,拷贝会递归地复制所有的数据,而不仅仅是引用。这意味着即使原始对象中的数据发生变化,拷贝的对象也不会受到影响。 Python中可以使用copy模块的deepcopy()函数来进行拷贝。 以下是拷贝的示例代码: ```python import copy # 列表的拷贝 list1 = [1, 2, [3, 4]] list2 = copy.deepcopy(list1) list1[2][0] = 5 print(list1) # 输出:[1, 2, [5, 4]] print(list2) # 输出:[1, 2, [3, 4]] # 字典的拷贝 dict1 = {'a': 1, 'b': [2, 3]} dict2 = copy.deepcopy(dict1) dict1['b'][0] = 4 print(dict1) # 输出:{'a': 1, 'b': [4, 3]} print(dict2) # 输出:{'a': 1, 'b': [2, 3]} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值