出自:https://blog.csdn.net/gavin_john/article/details/49758911
python与Java类似,有些数据类型是值传递,有些是引用传递。
比如列表list,在原处修改值
- >>> L1 = [1,2,3]
- >>> L2 = L1
- >>> L2
- [1, 2, 3]
- >>> L1[0] = 9
- >>> L1
- [9, 2, 3]
- >>> L2
- [9, 2, 3]
- >>> a = 1
- >>> b = a
- >>> a
- 1
- >>> b
- 1
- >>> a = 3
- >>> a
- 3
- >>> b
- 1
======================================================= =====================
由于Python具有缓存机制,所以python对小的数字也采用复用,如下例子:
- >>> a = 32
- >>> b = 32
- >>> a == b
- True
- >>> a is b
- True
上例中,按照常规,因为我们运行了两个不同的常量表达式,a和b两个变量应该指向不同的对象,但这里a is b返回了True,说明a和b指向了同一个对象。
这就说明,在Python中,小的整数和字符串被缓存并复用了
实际上,如果你想刨根问底的话,你可以向Python查询一个对象的引用次数:在sys模块中的getrefcount函数会返回对象的引用次数。
- >>> import sys
- >>> sys.getrefcount(1)
- 1130
- >>> a = 1
- >>> sys.getrefcount(1)
- 1130
- >>> b= 1
- >>> sys.getrefcount(1)
- 1130
- >>> d= 1
- >>> sys.getrefcount(1)
- 1131
- >>> e = 1
- >>> sys.getrefcount(1)
- 1132
- >>> f = 1
- >>> sys.getrefcount(1)
- 1133
在Python中,从技术上来讲,对象有更复杂的结构而不仅仅是有足够的空间表示它那么简单。每一个对象都有两个标准的头部信息:一个类型标识符去标识这个对象的类型,以及一个引用计数器,用来决定是不是可以回收这个对象。
【类型属于对象,而不是变量,比如a = 3,这时候a是整数类型,下一句执行a="3",a又变成了字符串类型,这是根据a变量指向的对象决定的,而不是a变量决定的】