V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
david2016
V2EX  ›  Python

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

  •  
  •   david2016 · 2016-05-08 18:03:26 +08:00 · 6312 次点击
    这是一个创建于 3119 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    http://kidlj.com/t/2014-11-25-python-trap.html
    mcfloundinho
        6
    mcfloundinho  
       2016-05-09 11:30:14 +08:00
    https://mcfloundinho.github.io/python-mutable.html
    鄙人的一篇 blog ,欢迎拍砖
    agnewee
        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
    agnewee
        8
    agnewee  
       2016-05-09 14:18:12 +08:00
    手误,第 11 行的 `#可变对象`应该标在第 10 行。抱歉。
    纯属个人理解,如有偏差,希望可以帮忙指出来,感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3459 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.