python学习笔记2:“=”的真正含义——引用
来源:互联网 发布:怎样设置域名 编辑:程序博客网 时间:2024/06/05 22:51
一、不同情况下b=a后的分析
实例1:不可变对象赋值
a=3b=a
a=4
a
b
实例2:可变对象赋值实例
a=[1,2,3]
b=a
a[0]=99
a
b
实例3:可变对象赋值实例
a=[1,2,3]
b=a
a=[99,2,3]
a
b
实例4:直接赋值实例
a=[1,2,3]
b=[1,2,3]
a[0]=99
a
b
大多数时候,我们可能只是想给a、b初始化相同的值,才用了b=a,在使用中,我们并不希望a修改后对b造成影响,或者修改b后,对a造成影响。
但从实例1和2看,b=a,有可能互不影响,有可能会相互影响,要视a的具体值的情况。我们应当如何理解这种情况,以至不会因为理解上的模糊不清,影响我们实际编程呢?1. b=a,实际是将a指向的对象的引用赋值给b,这样a和b就指向了同一个对象
2. 执行a=4(实例1),实际上是新创建一个对象4,再将4的引用赋值给a;
再执行a=[99,2,3](实例3),实际上是新创建一个对象[99,2,3],再将[99,2,3]的引用赋值给a;
这两种情况自然都不会影响到b的值,因为b的引用的对象本身并没有发生变化
3. 执行a[0]=99(实例2),修改的是对象[1,2,3]第一个元素的值,a和b所指向的还是这个对象,对象本身变化了,所以a和b变量看到的值也就都变化了
4. 执行a[0]=99(实例4),a和b本身指向的都是不同对象,自然修改a不会影响b。(不论出于什么因素,如果4中修改a后b也变了,那这种语言肯定也没必要学了,语言自己都混乱了,用它编程岂不更混乱)
从以上分析我们可以知道,b=a后,a、b是否会相互影响,关键在于修改的是不是对象本身的内容。如果修改的是对象本身的内容,则两者会相互影响;如果是创建新对象后直接赋值给上述某个变量,则两者不会相互影响
二、附上上述提到的两个概念(用于区分是否是修改对象本身的内容)
1.可变对象:
标准定义:如果对象的值是可以修改的,则称该对象为可变对象
包含:自定义类型、列表(list)、字典(dict)、可变集合(set)
特征:执行类似a=[1,2,3]后,再执行a[0]=99,实际上是这个对象第一个元素的值改为99;当然,如果是执行a=[1,2,3]后,再执行a=[99,2,3],就是新建对象[99,2,3]后赋值给变量a
2.不变对象:
标准定义:如果对象的值不可以修改,则称为不可变对象
包含:数字类型(int、long、float、complex、bool)、字符串类型(str、unicode)、元组(tuple)、不可变集合(frozenset)
特征:执行类似a=3后,再执行a=4,实际上不是将3这个对象所在的内存的值改为4,而是在内存中新建一个对象4,再赋值给变量a
0 0
- python学习笔记2:“=”的真正含义——引用
- 你理解类引用的真正含义吗?
- 程序设计的真正含义
- love的真正含义?
- “带宽”的真正含义
- RETSful 的真正含义
- impossible的真正含义
- 微软版本的真正含义
- 内存泄漏的真正含义
- const char* 的真正含义
- MYSQL SQL_NO_CACHE的真正含义
- 【1】指针的真正含义
- dll导出的真正含义
- Androd layout_weight的真正含义
- 反卷积的真正含义
- MYSQL SQL_NO_CACHE的真正含义
- 真正的入门—提高班的学习
- Python学习笔记2——python的数据类型
- Python2和Python3的比较
- Qt
- nginx学习文档之一 安装nginx-Windos下安装nginx
- 一切皆对象
- 数据库发展简史
- python学习笔记2:“=”的真正含义——引用
- Qt-为应用程序添加logo
- Error-Prone Command-line flags
- oracle 创建簇
- 操作符
- matlab -xlsread 打开xls文件出错:服务器出现意外情况
- PL/SQL
- Android Notification 详解——基本操作
- ORACLE 数据库操作语言