首页 > 编程语言 >Python中可变类型与不可变类型、浅拷贝与深拷贝

Python中可变类型与不可变类型、浅拷贝与深拷贝

时间:2022-08-22 15:04:33浏览次数:56  
标签:变量 Python print 地址 类型 拷贝 id

一、可变类型与不可变类型

1.可变类型:列表、字典、集合

2.不可变类型:字符串、整数、元组

#可变类型赋值给一个新变量时,新变量所指id是不变的,当原变量发生变化时,因为所指id一样所以新变量也会发生变化,新旧相互影响

#不可变类型赋值给一个新变量,新变量所指的id在原变量不发生改变时,所指id不变,一旦新变量内容发生变化就会指向一个新id,新旧之间不影响

二、浅拷贝与深拷贝

1.浅拷贝:浅拷贝变量中,既有可变类型,又有不可变类型,拷贝的是地址

 1 import copy
 2  
 3 a = ['hello', [1, 2, 3]]
 4 b = copy.copy(a)
 5 print('原容器:', a, '地址:', [id(i) for i in a])
 6 print('浅拷贝:', b, '地址:', [id(j) for j in b])
 7 print('------------------------------------')
 8 
 9 a[0] = 'world'
10 print(a)
11 print('原容器:', a, '地址:', [id(i) for i in a])
12 print('浅拷贝:', b, '地址:', [id(j) for j in b])#浅拷贝是在另一块地址上创建一个新的变量,但是变量内的元素是源对象的元素的地址的拷贝
13                                                 #拷贝的是地址
14 print('------------------------------------')
15 
16 a[1].append(4)
17 print('原容器:', a, '地址:', [id(i) for i in a])
18 print('浅拷贝:', b, '地址:', [id(j) for j in b])
19 
20 #浅拷贝时,拷贝变量内有不可变类型,当不可变类型被替换时,拷贝的还是指的旧id
21 #但是被拷贝对象的不可变类型id已经变化
22 #拷贝变量内有可变类型,其发生改变时id是不会变的,所以会相互影响

2.深拷贝:在新的地址上新建一个拷贝副本,只拷贝值,不拷贝地址

 1 import copy
 2  
 3 a = ['hello', [1, 2, 3]]
 4 c = copy.deepcopy(a)
 5 print('原容器:', a, '地址:', [id(i) for i in a])
 6 print('深拷贝:', c, '地址:', [id(j) for j in c])
 7 a[0] = 'world'
 8 a[1].append(4)
 9 print('原容器修改后:', a, '地址:', [id(i) for i in a])
10 print('原容器修改后深拷贝:', c, '地址:', [id(j) for j in c])
11 
12 #结果
13 
14 #原容器: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485804224]
15 #深拷贝: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485667712]
16 #原容器修改后: ['world', [1, 2, 3, 4]] 地址: [2165485837552, 2165485804224]
17 #原容器修改后深拷贝: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485667712]

 

标签:变量,Python,print,地址,类型,拷贝,id
From: https://www.cnblogs.com/jihexiansheng/p/16612773.html

相关文章

  • 验证码不会过?用Python带你实现简单的验证码处理
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐  我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~  那么今天!博主就给大家来一个......
  • Python标准库typing
    Python标准库typinghttps://docs.python.org/zh-cn/3/library/typing.html简介python3.5+才有Python运行时不强制执行函数和变量类型注解,但这些注解可用于类型......
  • 学习历程--八大数据类型
    publicclassDemo02{publicstaticvoidmain(String[]args){//八大数据类型//整数intnum=10;//最常用bytenum2=20;......
  • python-sys模块所有知识点
    #-*-coding:utf-8-*-#Python中sys模块:该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数#sys.argv#命令行参数List,第一个元素是程序本身路......
  • Python中re、shutil、argparse库
    一、re库是关于正则表达式#后续用到再补充 二、shutil库作为os模块的补充,提供复制、移动、删除、解压等操作复制文件shutil.copy(src,dst)复制文件夹shutil.copyt......
  • 【转】python系列之:str、byte、hex相互转换(全)
    python系列之:str、byte相互转换一、byte转化为str二、str转化为byte三、str、byte相互转换完整代码四、byte转化hex五、hex转化byte六、byte、hex相互转换完整代......
  • Python3 dict和str互转
    #Python3dict和str互转importaststr_of_dict="{'key1':'key1value111','key2':'key2value222'}"newdict=ast.literal_eval(str_of_dict)print(type(str_of......
  • Python-09_01函数参数的传递
    参数传递:在Python中,类型属于对象,变量是没有类型的:如Str=‘hello’;Str=50,在以上代码中,hello是string类型的,50是整型,而变量Str是没有类型的,它仅仅是一个对象的引用(指针),......
  • Python-09_02函数参数类型、函数嵌套
    1、Python函数参数类型:必备参数、关键字参数、缺省参数、任意个数参数。必备参数须以正确的顺序传入函数,也叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,......
  • 【未解决】 python type(json.load(f))为啥会报错?
    疑惑 pythontype(json.load(f))为啥会报错?而重新赋值res后,又不会报错?  赋值res前 ......