对象与引用

2016-08-03  本文已影响27人  lambdang

python中一切皆对象,

python中一切皆引用。


对象这是权威书籍中都有的话,但引用就不是了,根据c语言中的引用理解python中的‘变量’,更好理解。

引用指向对象,对象藏在引用后边,只能通过引用对对象操作,在python中所能见到的都是这个引用,而引用这个数据类型只保存一个数据就是对象的地址。

python中的数据类型分可变和不可变类型

字符串,元组,set,都是不可变,生成后其值无法改变,只能通过改变引用指向其他字符串来改变

>>> a="hello"

>>> id(a)

3070406016L

>>> a="world"

>>> id(a)

3070405952L

字典和列表都是可变对象,能通过引用对其改变

>>> a=[1,2,3,4]

>>> id(a)

3074666124L

>>> a[1]=5

>>> a

[1, 5, 3, 4]

>>> id(a)

3074666124L

一个对象赋值给引用表示把对象的地址赋值给了引用

一个引用赋值给引用 表示 把引用中的地址赋值给引用

>>> a=[1,2,3]

>>> b=a

>>> b

[1, 2, 3]

>>> a[0]=4

>>> b

[4, 2, 3]

有了上边的铺垫就能理解下边的函数中的参数

在大部分编程语言中,函数的参数都是“值传递”,c语言中的引用和指针虽然有址传递,但是那个址是指针或者引用的值,根本上讲也是传递的其中的内容 值,而且是复制进去的。

a=[1,2]

def f(arg):

    arg.append(3)

print(a)

f(a)

print(a)

==========================

[1, 2]

[1, 2, 3]


结果会改变因为arg这个引用也指向a所以可以通过arg改变a值类似下边代码

a=[1,2]

b=a

b.append(3)

print(a,b)

[1, 2, 3] [1, 2, 3]

看另一个例子:

a=[1,2]

def f(arg):

    arg=[3,4]

print(a)

f(a)

print(a)

结果

[1, 2]

[1, 2]

并没有改变a的值,因为参数传递的是引用的值就是参数指向了a指向的地址 但是在函数里把另一对像的地址赋值给了这个参数,至此参数跟a没有任何关系了,类似于下边代码

a=[1,2]

b=a

b=[3,4]

print(a,b)

这一切都是因为:

一切皆对象

一切皆引用

=赋值永远给的是地址

参数永远是新的引用


上一篇 下一篇

猜你喜欢

热点阅读