string,list,tuple

列表. 元组和字典

       Python支持3中基本序列数据类型:字符串string、列表list和元组tuple

 

       列表存储的通常是同种数据的序列,相反,元组通常存储异种数据的序列但这只是一种习惯,而非规则。

       元组的每个数据项都提供了元组所表示的总体信息中的一部分,假定一个元组表示某个班的一名学生,元组中可能包含学生的姓名、年龄、地址等信息。

       元组长度是事先确定的,不可在程序执行期间更改

       所以列表和元组的主要区别在于:列表是可变的,元组则是不可变的。

 

       Python不允许程序员选择采用传值还是传引用。Python参数采用的是传对象引用的方式,即函数收到的是对作为参数传递的值的一个引用。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到对一个可变对象的引用,就能修改对象的原始值相当于通过传引用来传递对象,而如果函数收到对一个不可变对象的引用,函数就不能直接修改原始对象相当于通过传值来传递对象。

指针

指针

内存和地址

       对于一个占用4个字节的int型数据,它有一个地址,至于它的地址是它最左边还是最右边的那个字节的位置,不同的机器有不同的规定

       还有一个比较蛋疼的边界对齐boundary alignment,就是要求对其的机器上,整型值存储的起始位置只能是某些特定的字节,通常是24的倍数。这也导致了有些数组的内存浪费。

       对于名字和内存位置之间的关联并不是硬件提供的,而是由编译器为我们实现的。

值和类型

       不管是int数、float数还是double型的数据,存储在计算机上的全是0或者1。所以对该数值的解析就决定了它的结果。比如下例:

一个二进制数为0110 0111 0110 1100 0110 1111 0110 0010

解析为:

类型

132int

1735159650

216int

2647628514

4个字符

glob

浮点数

1.116533X1024

机器指令

beg.+110ble.+102

       所以对于相同的数据,不同的解析方式决定了它的结果。

指针变量的内容

int *d=&a;的含义为da的地址,可以分解为int *d; d = &a;千万不要理解成了da的值。

未初始化和非法的指针

       未初始化的指针极具危险。指针必须初始化方可使用。

NULL指针

       标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,你可以给它赋一个零值。

指针、间接访问和左值

       指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。比如*a = 10 – *a

指针常量

       假设int a的地址为100,那么*100 = 25;代表的意思貌似是将25赋值给a,因为a是位置100所存储的变量,但是这个语句是错 的。这个语句是非法的,因为字面值100的类型是整型,而间接访问操作只能作用于指针类型表达式。所以,如果确实希望实现上面貌似代表的含义,需要使用强制类型转换,即*(int *)100 = 25

指针运算

       指针加法的 在于可以自动调整跳过的字节数,比如+1,对于char1个字节,而int4个字节,double可能就是8个字节。

关系运算

       只用当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。

       指针运算只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的指针执行算术运算是非法的(但常常很难被检测到)。

总结

l  大多数编译器都不会检查指针表达式的结果是否位于合法的边界之内。因此,程序员应该负起责任;

l  不要对一个为初始化的指针变量进行解引用;

l  不要对一个NULL指针进行解引用。