Python核心知识玩耍Python程序员

Python 序列容易忽视的知识点

2016-06-08  本文已影响128人  CinderellaM
文/CinderellaM

文章主要记录了条件和循环中的一些自己忽视的知识点,和一些自己在应用过程中出现的错误,系统的对这部分知识进行梳理与补充

一、序列

参考文献
成员有序排列,并且可以通过下标偏移量访问到它的一个或者几个成员。
访问模式:单个元素通过指定偏移量的方式得到,多个元素可以通过切片操作的方式一次得到。

1.序列类型操作符

string1+sring2
list1+list2
tuple1+tuple2
s+=t
```

str='123abc'
str*=3
print str

123abc123abc123abc
*操作符也可以用于嵌套列表
list=[1,2,3]
lista=[list]*3
lista[1][1]=100
'''lista是多少?可能并不是你想的那样'''
print lista

[[1,100,3],[1,100,3],[1,100,3]]
```
下面这幅图说明了原因,在处理可变序列时要谨慎:)

lista

2.内建函数

  1. 可操作

3.字符串

参考文献
字符串是不可变类型,改变一个字符串中的元素,需要创建一个新的字符串,并对其进行操作

string='abcedef'
slice1=string[None:]
slice2=string[:None]
slice3=string[:]

>>slice1='abcdef'
>>slice2='abcdef'
>>slice3='abcdef'

删除string后,slice1并没有受到影响:

slice1=string[None:]
slice2=string[0:3]
slice1 is string
>>True
del string
print slice1
>>'abcdef'
print slice2
>>'abc'

直到删除了所有指向’abcdef‘的变量,其占用的内存被释放

slice1=string 没有指向该对象的变量 slice2=string[0:3] 字符串格式化符号

Python支持两种格式的输入参数:

'MM/DD/YY=%02d/%02d%03d'  % (2,15,67)
'there are %(howmany)d %(lang)s Quotation Sysbols'  % {'lang':'Python','howmany':3}

格式字符串既可以用作向终端用户输出数据,又可以用来合并字符串形成新字符串,通过使用操作符的辅助命令,可以对需要显示的值的格式进行修改。


格式化操作符辅助命令

下面是一些例子:
浮点型

'%d' % 12.34
>>12
'%.1f' % 12.34
>>12.3

整形和字符串

'MM/DD/YY=%02d/%02d%03d'  % (2,15,67)
>>'MM/DD/YY=02/15/067

4.列表

参考文献

listA=[1,2,3,4,5]
slice1=listA[:]
slice2=listA
slice3=list(lisAt)
listA
listB=[1,2,3,[4,5]]
slice1=listB[:]
slice2=listB
slice3=list(listB)

由下图可知,改变listB中的1,2,3,只有slice2受到影响。但是改变4,5,slice1、slice2、slice3均会受到印象,因为它们当中均存放着[4,5]的引用,而不是完全拷贝的独立对象。

listB

通过上面的分析,我们需要引起注意在使用列表作为函数参数时是很容易忽略这一点的,由于函数对列表不是深拷贝而只是引用了该列表的内存空间,所以一旦后续的操作对作为参数的列表进行修改,那么引用该列表的变量都会发生改变,这是非常糟糕的现象,而且很难被发现。因为虽然该列表可能是函数内的局部变量,可是因为一直有对象引用它,所以它占用的内存空间不会被释放和清理。比如下面的这段程序:

formTitle='a form name'
formPostion=(x,y)
col0=[]
col1=[]
for formx_row in range(row+3,sheet.nrows):
    col0.append(sheet.cell_value(formx_row-1,col))
    col1.append(Param.float_to_int(sheet.cell_value(formx_rolw-1,col+1)))
excel_ddrport.set_ddrport(formTitle,formPostion,col0,col1)

虽然程序中循环多次,试图把不同内容作为元组填入一个列表中,但是由于col0,col1是列表,所以最后生成的列表中col0,col1的值都是一样的,而且是最后一此退出循环时,col0,col1的值,而formTitle是字符串,每次对它的浅拷贝均会创建一个新的对象,所以formTitle是正确的。

5.元组

atuple=(1,)
atuple=(1,2,3)
alist=list(atuple)
print alist
>>[1,2,3]

同列表

上一篇下一篇

猜你喜欢

热点阅读