python不可变类型和可变类型(为什么我的列表/字典,没有改变它却自己变了?)

简介: python不可变类型和可变类型(为什么我的列表/字典,没有改变它却自己变了?)

大家在刚接触或平时使用python的时候,可能都会出现类似如下的情况:

a = [1, 2]
b=a
print('改变b前,a的值:',a)
b[0] = 2
print('改变b后,a的值:',a)
print('b:', b)
--------输出结果-------------
  改变b前,a的值: [1, 2]
  改变b后,a的值: [2, 2] # 没有改变a,a不应该等于[1,2]吗? 为什么等于[2,2]了
  b: [2, 2]

为什么我只给b赋值,但a却被改变了?


a不应该等于[1,2]吗!!!

这里就需要了解python中可变类型和不可变类型的区别了

在上述代码中,虽然a的值赋值给了b,但由于a是一个可变类型,赋予b的值实际上是a的内存地址,这个时候b和a共用一个内存地址,在改变b值的操作后,由于内存地址未发生变化,所以a的值也相当于被改变了。

python中可变类型有三种:list, dict,set

那如何让改变b的时候,不改变a呢?

可以使用深拷贝:


import copy
a = [1, 2]
b = copy.copy(a)  # 深拷贝a
print('改变b前,a的值:', a)
b[0] = 2
print('改变b后,a的值:', a)
print('b:', b)
--------输出结果-------------
  改变b前,a的值: [1, 2]
  改变b后,a的值: [1, 2]
  b: [2, 2]

如果是不可变类型(string,int,float,tuple),则不会出现上述情况

b = a = 2
print('改变b前,a的值:', a)
b = 1
print('改变b后,a的值:', a)
print('b:', b)
--------输出结果-------------
  改变b前,a的值: 2
  改变b后,a的值: 2
  b: 1


目录
相关文章
|
22天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
87 1
|
19天前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
271 116
|
19天前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
235 119
|
19天前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
|
14天前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
89 1
|
19天前
|
大数据 开发者 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
|
存储 Python
python字典中删除键值的方法
python字典中删除键值的方法
364 0
|
Python
python知识点100篇系列(8)-字典去重复的几种方法
python知识点100篇系列(8)-字典去重复的几种方法
436 1
|
存储 JSON JavaScript
Python字典和JSON字符串相互转化方法
【2月更文挑战第18天】
493 3
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
404 4

推荐镜像

更多
下一篇
开通oss服务