本人编程新手,刚开始学 python ,看到一些 python 文章里写到可变对象与不可变对象,网上查阅后对这个概念依然很模糊,希望各位大牛给解释下
1
kukuwhu 2016-05-08 18:19:19 +08:00
可变即内存空间可变,不可变即内存空间不可变。 可变的对象的变量在传递时,传递的是引用地址(可以理解为指针),所以拷贝的时候不是真正拷贝内存空间,仅仅是多了个变量指向相同的内存空间而已。对新的变量进行增删都会影响到原始变量,即浅拷贝。不可变对象,拷贝或通过新变量传递时,一旦发生修改,会新产生一个跟原来对象属于不同内存空间的新对象。
|
2
kkzxak47 2016-05-08 18:33:59 +08:00 via Android
自己做实验,用 id 函数看各种操作之后对象的内存地址有没有变化。
简单说可变对象可以原地发生变化,比如 list 里插入一些值,自己 id 不变; 但 tuple 想“插入”一些值,只能重建一个,这样 id 就会发生变化。 |
3
529084167 2016-05-08 18:44:51 +08:00
我最近也看到这些知识点。我回复一下,就不从可变对象与不可变对象是什么说起了,毕竟楼上讲的很不错了。我说一下可变对象,不可变对象有哪些吧~可变对象包括列表,字典,自定义类型啦~不可变对象包括数值型,字符串等~理解得不对的地方请大家指正。
|
4
Allianzcortex 2016-05-08 19:16:37 +08:00
可变和不可变,immutable,主要在拷贝方式的定义上
LZ 看我之前在另一个问题下的回复吧 |
5
kidlj 2016-05-08 19:18:36 +08:00 1
我写过一篇博客,探讨 Python 二维列表初始化容易踏进的一个坑,顺便引出了可变与不可变对象的讨论。如果不嫌弃请移步参考:
http://kidlj.com/t/2014-11-25-python-trap.html |
6
mcfloundinho 2016-05-09 11:30:14 +08:00
https://mcfloundinho.github.io/python-mutable.html
鄙人的一篇 blog ,欢迎拍砖 |
7
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 |
8
agnewee 2016-05-09 14:18:12 +08:00
手误,第 11 行的 `#可变对象`应该标在第 10 行。抱歉。
纯属个人理解,如有偏差,希望可以帮忙指出来,感谢。 |