python 里的可变对象与不可变对象具体怎么理解?

2016-05-08 18:03:26 +08:00
 david2016

本人编程新手,刚开始学 python ,看到一些 python 文章里写到可变对象与不可变对象,网上查阅后对这个概念依然很模糊,希望各位大牛给解释下

6354 次点击
所在节点    Python
8 条回复
kukuwhu
2016-05-08 18:19:19 +08:00
可变即内存空间可变,不可变即内存空间不可变。 可变的对象的变量在传递时,传递的是引用地址(可以理解为指针),所以拷贝的时候不是真正拷贝内存空间,仅仅是多了个变量指向相同的内存空间而已。对新的变量进行增删都会影响到原始变量,即浅拷贝。不可变对象,拷贝或通过新变量传递时,一旦发生修改,会新产生一个跟原来对象属于不同内存空间的新对象。
kkzxak47
2016-05-08 18:33:59 +08:00
自己做实验,用 id 函数看各种操作之后对象的内存地址有没有变化。
简单说可变对象可以原地发生变化,比如 list 里插入一些值,自己 id 不变; 但 tuple 想“插入”一些值,只能重建一个,这样 id 就会发生变化。
529084167
2016-05-08 18:44:51 +08:00
我最近也看到这些知识点。我回复一下,就不从可变对象与不可变对象是什么说起了,毕竟楼上讲的很不错了。我说一下可变对象,不可变对象有哪些吧~可变对象包括列表,字典,自定义类型啦~不可变对象包括数值型,字符串等~理解得不对的地方请大家指正。
Allianzcortex
2016-05-08 19:16:37 +08:00
可变和不可变,immutable,主要在拷贝方式的定义上

LZ 看我之前在另一个问题下的回复吧
kidlj
2016-05-08 19:18:36 +08:00
我写过一篇博客,探讨 Python 二维列表初始化容易踏进的一个坑,顺便引出了可变与不可变对象的讨论。如果不嫌弃请移步参考:

http://kidlj.com/t/2014-11-25-python-trap.html
mcfloundinho
2016-05-09 11:30:14 +08:00
https://mcfloundinho.github.io/python-mutable.html
鄙人的一篇 blog ,欢迎拍砖
agnewee
2016-05-09 14:16:30 +08:00
可变对象和不可变对象在 python 中,如字面意思一样,可变对象一旦创建之后还可改变但是地址不会发生改变,即该变量指向的还是原来的对象。而不可变对象则相反,创建之后不能更改,如果更改则变量会指向一个新的对象。
举个栗子:
>>> s = 'abc' # 不可变对象
>>> id(s)
3072200191
>>> s += 'd'
3072200325
>>> l = ['a','b','c']
>>> id(l) # 可变对象
3072200074
>>> l += 'd'
>>> id(l)
3072200074

会发现,对不可变对象进行添加元素的操作,会让变量指向对象地址发生改变,而可变对象地址则不会改变。
python 内置对象中,中可变对象 list, dict. 不可变对象 str, int, tuple, float
agnewee
2016-05-09 14:18:12 +08:00
手误,第 11 行的 `#可变对象`应该标在第 10 行。抱歉。
纯属个人理解,如有偏差,希望可以帮忙指出来,感谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/277152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX