python的对象及引用
2016-08-15 15:20
274 查看
作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘。
首先背书python中的引用对象问题:
1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值'来传递对象。
2. 当人们复制列表或字典时,就复制了对象列表的引用同,如果改变引用的值,则修改了原始的参数。
3. 为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象
首先,我们来了解一下python的基础概念:
1. Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如list。而不可变的对象则相反,表示其内容不可变。
不可变对象:int,string,float,tuple
可变对象 :list,dictionary
2. Python函数的参数传递采用的是“传对象引用”的方式。
下面我们用例子来理解一下以上概念:
[python] view
plain copy
x=1
y=x #y跟x指向同一个对象引用
x=2 #由于x是不可变对象,这时候旧的对象被系统回收,x指向新的对象引用
print x,y #结果是2,1
[python] view
plain copy
a = ['1'] #a指向了一个list可变对象引用
b = a #b跟a指向同一个对象引用
a[0] = 2 #改变a对象引用的值,那么跟a指向同一个对象引用的b的值也随之同步改变。
print a,b #结果是2,2
[python] view
plain copy
def func(a):
a[0]=1 #改变a对象引用的值,那么跟a指向同一个对象引用的b的值也随之同步改变。
b=['2']
func(b) #上面提到,函数的参数传递就是传对象引用,所以这里就相当于b=a,即b跟a指向同一个对象引用
print b #结果[1]
注意下面这个例子跟上面例子的区别。
[python] view
plain copy
def func(a):
a=['1'] #这里并没有修改a指向的对象引用的值,而是a指向了新的对象引用,所以最后b的值没有改变。
b=['2']
func(b)
print b #结果[2]
首先背书python中的引用对象问题:
1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值'来传递对象。
2. 当人们复制列表或字典时,就复制了对象列表的引用同,如果改变引用的值,则修改了原始的参数。
3. 为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象
首先,我们来了解一下python的基础概念:
1. Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如list。而不可变的对象则相反,表示其内容不可变。
不可变对象:int,string,float,tuple
可变对象 :list,dictionary
2. Python函数的参数传递采用的是“传对象引用”的方式。
下面我们用例子来理解一下以上概念:
[python] view
plain copy
x=1
y=x #y跟x指向同一个对象引用
x=2 #由于x是不可变对象,这时候旧的对象被系统回收,x指向新的对象引用
print x,y #结果是2,1
[python] view
plain copy
a = ['1'] #a指向了一个list可变对象引用
b = a #b跟a指向同一个对象引用
a[0] = 2 #改变a对象引用的值,那么跟a指向同一个对象引用的b的值也随之同步改变。
print a,b #结果是2,2
[python] view
plain copy
def func(a):
a[0]=1 #改变a对象引用的值,那么跟a指向同一个对象引用的b的值也随之同步改变。
b=['2']
func(b) #上面提到,函数的参数传递就是传对象引用,所以这里就相当于b=a,即b跟a指向同一个对象引用
print b #结果[1]
注意下面这个例子跟上面例子的区别。
[python] view
plain copy
def func(a):
a=['1'] #这里并没有修改a指向的对象引用的值,而是a指向了新的对象引用,所以最后b的值没有改变。
b=['2']
func(b)
print b #结果[2]
相关文章推荐
- python 引用,拷贝,对象回收,弱引用
- 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)
- 跟老齐学Python之深入变量和引用对象
- 对python变量和对象引用的探讨
- [零基础学Python]深入变量和引用对象
- python笔记(五) - 获取对象的引用
- python引用在函数传参时的体现以及可变与不可变对象的对比
- python赋值和拷贝----一切皆对象,参数皆引用
- python赋值和拷贝----一切皆对象,参数皆引用
- Python 变量 对象 引用
- Python 初体验之 对象的引用和拷贝
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python中的对象和引用
- python对象的复制问题,按值传递?引用传递?
- python中的对象拷贝示例 python引用传递
- python函数是引用传递(对可变对象而言)
- python中的对象和引用 分类: python基础学习 2013-10-30 16:20 264人阅读 评论(0) 收藏
- python 对象拷贝——浅拷贝和深拷贝 之函数传递——值传递还是引用传递?
- Python对象引用和del删除引用
- python中对象引用计数的相关问题