可变对象 vs 不可变对象(Python)
Python 在 heap 中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如 list。而不可变的对象则相反,表示其内容不可变。
- 不可变对象:int,string,float,tuple
- 可变对象 :list,dictionary
1. 不可变对象
由于 Python 中的变量存放的是对象引用(reference),所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的(相当于 C 语言中指向常量的指针,指针可以指向新的内存空间,但之前指向的常量不可改变)。运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。如下面的代码:
由上可知, 不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用,指向新的不可变对象。作如下验证:
>> a = 1
>> id(a)
30310136L
>> b = 1
>> id(b)
30310136L
# 也即因为 a,b 都指向的是不可变对象,python 解释器就不再开辟新的内存空间,a、b 共同指向同一个不可变对象;
>> a += 1
>> id(a)
30310112L
# a 指向了另外的内容
>> id(b)
30310136L
2. 可变对象
其对象的内容是可以变化的。当对象的内容发生变化时,变量的对象引用是不会变化的(直接上原始内存空间处进行修改)。如下面的例子。
>> m = [5, 9]
>> id(m)
155821128L
>> m += [6]
>> id(m)
155821128L
可变对象 vs 不可变对象(Python)的更多相关文章
- 【Python】可变对象和不可变对象
Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...
- Python 可变对象和不可变对象
具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254 不可变对象:int,string,float,tuple 可变对象 :list,dicti ...
- Python中的可变对象和不可变对象
Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
- python,可变对象,不可变对象,深拷贝,浅拷贝。
学习整理,若有问题,欢迎指正. python 可变对象,不可变对象 可变对象 该对象所指定的内存地址上面的值可以被改变,变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发 ...
- python 中的可变对象与不可变对象
近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...
- python可变对象与不可变对象的差别
一.可变对象和不可对象 Python在heap中分配的对象分成两类:可变对象和不可对象.所谓可变对象是指,对象的内容可变,而不可变对象是指内容不可变. 不可变对象:int.string.float ...
- Python入门之python可变对象与不可变对象
本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变. python内置的一些类型中 可变对象: ...
- python可变对象与不可变对象
可变/不可变对象定义 不可变对象 该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可 ...
- Python的可变对象与不可变对象。
参考:http://thomaschen2011.iteye.com/blog/1441254 Python基础:Python可变对象和不可变对象 http://blog.jobbo ...
- Python坑系列:可变对象与不可变对象
在之前的文章 http://www.cnblogs.com/bitpeng/p/4748148.html 中,大家看到了ret.append(path) 和ret.append(path[:])的巨大 ...
随机推荐
- jquery mobile常用的data-role类型介绍
转自原文 jquery mobile常用的data-role类型介绍 data-role参数表: page 页面容器,其内部的mobile元素将会继承这个容器上所设置的属性 header ...
- JDK+JDBC+MySQL实例及注意事项
by qx.zhong Hangzhou 29 Jun 2014 开发环境 OS: Win8.1 x64 JDK: 1.8 SE DB: MySQL 5.5 Lib: mysql-connec ...
- 编写html经常使用而又easy忘记的语句
设置文件字符编码: <meta charset="utf-8"> 内部样式表: <style type="text/css"> hr { ...
- [Maven实战](5)Archetype生成项目骨架
Hello World项目中有一些Maven的约定:在项目根文件夹中放置pom.xml,在src/main/java文件夹下放置项目的主代码,在sc/test/java中放置项目的測试代码.之所以一步 ...
- cocos2d-x 3.0的坑有哪些
问题一:setup.py 之后, ANT文件夹为什么创建不成功? ANT文件夹要指定到bin以下,NDK和SDK则指定要根文件夹就可以 问题二:cocos run -p android 之后,执行应用 ...
- True or False? and WHY??? Java HashSet Contains
import java.util.HashSet; public class MyClass { public String s; public MyClass(String s) { this.s ...
- Stop being a perfectionist
节选自 7 Things You Need To Stop Doing To Be More Productive, Backed By Science “We found that perfecti ...
- xBIM 基础11 WeXplorer 常用事件
系列目录 [已更新最新开发文章,点击查看详细] 本篇将介绍查看器在不同场合触发的事件.所有这些都记录在xViewer中. 如果您从Web服务器运行本教程,可以在此处查看完整的实例.并且确保您的 ...
- JavaScript学习记录二
title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- POJ 1952 DP
思路: 这题要求最长下降子序列的长度和个数,我们可以增加 数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度) 和maxnum[size](记录1~i之间的最长下降序列个数 ...