1,一切皆为对象
a = 5 #a =5 在c中是非常普通的赋值,我们也通常把这个语句叫做赋值语句,但是在python中,这样的理解就错了。
id(a)
Out[20]: 1518791248
id(5)
Out[21]: 1518791248
#我们分别查一下他们的内存地址,发现地址是一样的,原来python把这语句看做是对象实例化的语句。就是把一个整数对象实例化变量为a,如果用c来写的话,要 写成:a= new 5() ,很奇怪,一个类,或者对象是不可以用数字来命名的,但是可以作为对象实例化,或者类的实例化。
2,组成: id, type, 'value'
'value'带引号,这里讲的是对象的组成,而不是属性。'int' object has no attribute 'value'
3, 一切皆指针
a = 5
#在C的角度,应该写为 *a = 5。并不是定义了一个变量,而是定义了一个指针。在python中,确确地说,用的是指针变量。
4,类型: int,boolean,string,list,tuple,dict
5,不可变:int ,string,tuple
可变: list,dict
- 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址(原来值因为不再有对象指向它,就会被垃圾回收。)。
- 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。
当向系统申请创建一个变量时,系统先分配一块内存空间,该内存空间用于存储该变量。
变量的数据结构包括2部分:第一部分用于存储变量的名称和变量的数据类型的长度,第二部分用于存储内存地址(即索引)。
当变量未初始化时,第二部分数据为垃圾值;一旦初始化,该部分的值即为初始化值的内存地址。
- 需要注意的是:tuple是不可变对象,但又和str和数值类型稍微有点区别。
add = (1, 2, 3)
aee = (1, 2, 3)
print(id(add), id(aee), id((1, 2, 3))) # id各不相同
a = 2
b = 2
print(id(a), id(b), id(2)) # id都相同
astr = 'good'
bstr = 'good'
cstr = astr + ''
print(cstr is bstr) # True
print(id(astr), id(bstr), id('good')) # 三个id相同
- 平常说的tuple不可变更多时候是指里面存放的值不能被改变(有些特殊情况,如tuple里面存放了list,可改变list里的元素。但实际上这个tuple并没有被改变)。
id(add)
Out[34]: 2671383886368
add[1][2]=3add
Out[36]: (1, [2, 3, 3], 3)
id(add)#id相同
Out[37]: 2671383886368
- copy()与deepcopy()区别 : 浅拷贝copy()只是生成一个新的对象,数据结构以及索引关系未变。深拷贝会递归(逐层)拷贝list的数据结构(彻头彻尾的另立门户)。
>>> import copy
>>> origin = [1, 2, [3, 4]]
#origin 里边有三个元素:1, 2,[3, 4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>> cop1 is cop2
False
#cop1 和 cop2 看上去相同,但已不再是同一个object
>>> origin[2][0] = "hey!"
>>> origin
[1, 2, ['hey!', 4]]
>>> cop1
[1, 2, ['hey!', 4]]
>>> cop2
[1, 2, [3, 4]]
>> a = [1, 2, 3]
>>> b = a
>>> a = [4, 5, 6] //赋新的值给 a
>>> a
[4, 5, 6]
>>> b
[1, 2, 3]
# a 的值改变后,b 并没有随着 a 变
>>> a = [1, 2, 3]
>>> b = a
>>> a[0], a[1], a[2] = 4, 5, 6 //改变原来 list 中的元素
>>> a
[4, 5, 6]
>>> b
[4, 5, 6]
# a 的值改变后,b 随着 a 变了
#上下两端代码的对比意义说明了:list是可变对象,int是不可变对象。6,python2解释器默认编码类型utf-8,每个汉字三个字节,len(*)==3,decode("utf-8")转换为unicode。python3解释器默认编码类型是unicode,len(*)==1