jacktangj 2020-02-02
一: deque
创建双向队列
import collections
d = collections.deque()
1. append ----往右添加一个元素
d.append(1)
2. appendleft---往左边添加一个元素
d.appendleft(2)
3. clear -----清空队列
4. copy
new_d = d.copy()
备注:
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变-------------深拷贝
拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。
一个非拷贝的例子:
=赋值:数据完全共享(=赋值是在内存中指向同一个对象,如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变
如果是不可变类型(immutable),比如字符串,修改了其中一个,另一个并不会变)
浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)
l1 = [1,2,3,[11,22,33]]
l2 = l1.copy()
print(l2) #[1,2,3,[11,22,33]]
l2[3][2]=‘aaa‘
print(l1) #[1, 2, 3, [11, 22, ‘aaa‘]]
print(l2) #[1, 2, 3, [11, 22, ‘aaa‘]]
l1[0]= 0
print(l1) #[0, 2, 3, [11, 22, ‘aaa‘]]
print(l2) #[1, 2, 3, [11, 22, ‘aaa‘]]
print(id(l1)==id(l2)) #Flase
如上述代码,l2浅拷贝了l1 ,之后l2把其列表中的列表的元素给修改,从结果看出,l1也被修改了。但是仅仅修改l1列表中的第一层元素,却并没有影响l2。
比较一下l2与l1的内存地址:False,说明,l2在内存中已经独立出一部分复制了l1的数据,但是只是浅拷贝,第二层的数据并没有拷贝成功,而是指向了l1中的第二层数据的内存地址,所以共享内存‘相当于‘’等号赋值’‘,所以就会有l2中第二层数据发生变化,l1中第二层数据也发生变化
深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)
深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。
5. count(返回指定元素的出现次数)
d.count("a")
6. extend(从队列右边扩展一个列表的元素)
d.extend([3,4,5])
7. extendleft(从队列左边扩展一个列表的元素)
8. index(查找某个元素的索引位置)
9. insert(在指定位置插入元素)
10. pop(获取最右边一个元素,并在队列中删除)
11. popleft(获取最左边一个元素,并在队列中删除)
12. remove(删除指定元素)
13. reverse(队列反转)
14. rotate(把右边元素放到左边)
d.rotate(2) #指定次数,默认1次
15. 限制deque的长度
d=deque(maxlen=20)
zfill (width) 返回长度为 width 的字符串,原字符串右对齐,前面填充0
isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。