python学习笔记2:“=”的真正含义——引用

来源:互联网 发布:怎样设置域名 编辑:程序博客网 时间:2024/06/05 22:51

一、不同情况下b=a后的分析

实例1:不可变对象赋值

a=3
b=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