ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python基础——变量可变不可变&深浅拷贝

2022-07-29 01:33:31  阅读:189  来源: 互联网

标签:name Python dd 89 深浅 内存 print 拷贝 id


1. 深入了解数据 及其类型

  场景:别人使用我们的代码,传递了数据a 和数据b   问题:如何知道它们分别是什么,以及如何使用?
name='beifan'

print("唯一表示(内存地址)", id(name))   #变量的内存地址
print("数据类型", type(name))      #获取变量类型
print("数据成员", dir(name))     #数据成员 = 属性(不可调用) + 方法(可调用的)
print("是否可以调用", callable(name))  #变量是否可调用
print("方法的用法:",help(name.index()))    #字符串name对应的index方法的用法

2.可变对象和不可变对象

2.1 可变对象

   列表,字典,集合,对原内存进行修改,id不变
l = []
print("修改前的id = ", id(l)) 
l.append(123)
print("修改后的id = ", id(l))
print(l)

修改前的id = 1944158072960
修改后的id = 1944158072960
[123]

 

2.2 不可变对象

数值、字符串、元组-------原内存未变,在新内存放入新值

i = 123
print("修改前的id = ", id(i))
i += 1
print("修改后的id = ", id(i)) # 新的内存保存新的值
print(i)

修改前的id = 1824816697392
修改后的id = 1824816697424
124

 

2.3 特殊情况

虽然也会创建新的对象,但是原对象没有发生变化 对于可变对象来说,也不一定每一次的修改,都是在原内存空间进行的
l = [1, 2, 3]
print("l的ID", id(l))
l = l[:2]
print("l的ID", id(l))
print(l)

l的ID 1964630143104
l的ID 1964630095936
[1, 2]

 

3、赋值说明

(1) = 赋值号,用来传递变量,而不是创建变量 (2) "sunny" 写在代码中的时候,内存已经创建好
name = "sunny"  # 创建新的内存
new_name = name # 不是创建新变量,而是把已有变量,传递过来
print(id(name))
print(id(new_name))

2630317342640
2630317342640

4.深拷贝和浅拷贝(针对可变对象)

4.1 浅拷贝--只为对象开辟了内存,没有为成员开辟内存

浅拷贝做了2件事情: 1、为“目标对象”创建副本 2、将“副本对象”的成员,指向“目标对象”的成员 也就是说,只为对象开辟了内存,没有为对象的成员开辟内存
import copy

d = {
    "name": "beifan",
    "age": 18,
    "size": [89, 89, 89]
}
dd = copy.copy(d)  # 浅拷贝
dd['size'].pop()   #dd元素size修改后,d对应的也会更新
print("复制的字典", id(d), id(dd))  # 创建新的内存
print("字典中的字符串", id(d['name']), id(dd['name']))  # 没有创建新的内存
print("字典中的整数", id(d['age']), id(dd['age']))  # 没有创建新的内存
print("字典中的列表", id(d['size']), id(dd['size']))  # 没有创建新的内存
print(d) 
print(dd)

复制的字典 1375910854400 1375910887488
字典中的字符串 1375910887536 1375910887536
字典中的整数 1375905579792 1375905579792
字典中的列表 1375911344768 1375911344768
{'name': 'beifan', 'age': 18, 'size': [89, 89]}
{'name': 'beifan', 'age': 18, 'size': [89, 89]}

4.2深拷贝---不仅对象开辟了内存,也为成员开辟内存

深拷贝做了3件事情: (1) 为“目标对象”创建副本 (开辟内存) (2) 为“目标对象的成员(以及成员的成员)”创建副本 (开辟内存) (开辟内存) (开辟内存) (开 辟内存) (3) 将“副本对象”的成员,指向新创建的 ”副本成员“
import copy

d = {
    "name": "beifan",
    "age": 18,
    "size": [89, 89, 89]
}
dd = copy.deepcopy(d) # 深拷贝
dd['size'].pop()   #dd元素size修改后,数据隔离,d不会更新,
print("复制的字典", id(d), id(dd))  # 创建新的内存
print("字典中的字符串", id(d['name']), id(dd['name']))  # 没有创建新的内存
print("字典中的整数", id(d['age']), id(dd['age']))  # 没有创建新的内存
print("字典中的列表", id(d['size']), id(dd['size']))  # 创建了新内存
print(d)
print(dd)

复制的字典 1667011608320 1667011962368
字典中的字符串 1667011641456 1667011641456
字典中的整数 1667010331408 1667010331408
字典中的列表 1667012098688 1667011963648
{'name': 'beifan', 'age': 18, 'size': [89, 89, 89]}
{'name': 'beifan', 'age': 18, 'size': [89, 89]}

 

 

 

标签:name,Python,dd,89,深浅,内存,print,拷贝,id
来源: https://www.cnblogs.com/sunny-test/p/16530872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有