一:python有两种数据类型:
可变数据类型(mutable object):列表可以通过引用其元素,改变对象自身(in-place change), 这种数据类型,称之为可变数据类型,词典也是这样的数据类型
不可变数据类型(immutable object):像数字和字符串,不能改变对象本身,只能改变引用的指向,称之为不可变数据类型,元组(tuple)尽管可以调用引用元素,但不可以赋值,因为不能改变对象本身,所以也是不可变数据类型
is关键字:要想知道是否指向同一个对象,可以使用python中的is关键字,其是判断两个引用所指的对象是否相同
‘==’
二:值传递和引用传递
关于值传递和引用传递,综合目前各种的说法,可以得出这样的结论:可变对象为引用传递,不可变对象为值传递。但是python中一切事物均视为对象,个人觉得值传递和对象传递只不过是对象引用的两种表现。如果是可变对象的引用(比如字典、列表),就能修改对象的原始值,相当于通过传引用来传递对象,不可变对象(如数字、字符、元组),就不能通过直接修改原始对象,相当于是通过传值传递对象。
具体的表现就是当赋值(引用)列表或者字典时,如果改变引用的值,就修改了原始的对象
>>> a=[1,2,3,4]
>>> b=a #列表引用
>>> id(a)
56454360
>>> id(b) #a,b的内存地址一样,说明这里是内存地址拷贝,可以理解为指针指向
56454360
>>> b.append(5) #改变b的值,可以发现原始对象a的值也同样改版
>>> b
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4, 5]
1
2
3
4
5
6
7
8
9
10
11
而对于不可变对象
>>> i=1
>>> i1=i #传递不可变对象数字
>>> i
1
>>> i1
1
>>> id(i)
23479136
>>> id(i1) #此时两者内存地址相同,可以理解为指针指向
23479136
>>> i1=2 #改变i1的值
如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递,如果参数在函数体内被修改,那么源对象也会被修改。
如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。那么源对象是不会改变的,