python 里的可变对象与不可变对象具体怎么理解? - V2EX
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 6673 次点击
    这是一个创建于 3446 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人编程新手,刚开始学 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     Solana     5580 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:23 PVG 09:23 LAX 18:23/a> JFK 21:23
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86