推荐学习书目
› 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 · May 8, 2016 · 7336 views
    This topic created in 3791 days ago, the information mentioned may be changed or developed.

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

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

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

    http://kidlj.com/t/2014-11-25-python-trap.html
    mcfloundinho
        6
    mcfloundinho  
       May 9, 2016
    https://mcfloundinho.github.io/python-mutable.html
    鄙人的一篇 blog ,欢迎拍砖
    agnewee
        7
    agnewee  
       May 9, 2016
    可变对象和不可变对象在 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  
       May 9, 2016
    手误,第 11 行的 `#可变对象`应该标在第 10 行。抱歉。
    纯属个人理解,如有偏差,希望可以帮忙指出来,感谢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1106 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 23:37 · PVG 07:37 · LAX 16:37 · JFK 19:37
    ♥ Do have faith in what you're doing.