欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python学习笔记--列表的相关操作

程序员文章站 2024-01-07 11:39:58
...

以下内容均为本人学习笔记,若有不当,欢迎指出

列表

Python中的列表对比于C++中的数组来说更灵活一些,可以包含不同类型的对象

  • 特点一:

使用切片操作类似于字符串的切片操作,但是还可以改变元素

a = [1, 2, 3, 4, 5]                                                             
a[0] = 9                                                                        
print a

执行结果:

[9, 2, 3, 4, 5]
  • appen:追加元素
a = [1, 2]                                                                      
a.append(8)                                                                     
print a 

执行结果:

[1, 2, 8]
  • 删除指定下标的元素
a = [0, 1, 2]                                                                   
del a[2]                                                                        
print a  

执行结果:

[0, 1]
  • 按值删除元素
a = [1, 2, 3]                                                                   
a.remove(3)                                                                     
print a

执行结果:

[1, 2]
  • 列表的比较操作:
    == 和 != 是所有元素都符合
    < , <= , > , >= 是两个列表从第一个个元素开始比较,知道某一元素比出结果
a = ['abc', 123]                                                                
b = ['bcd', 000]                                                                
c = [123, 'abc']                                                                

print a < b                                                                     
print b > c 

执行结果:
(python3的话不同类型是不可以比较大小的)

True
True
  • extend 连接操作
a = [1, 2]                                                                      
a.extend([3, 4])                                                                
print a 

列表不支持+=操作,这里的连接操作相当于+=操作

  • 排序操作

python中对序列有一个内建函数sorted()支持排序,但是会生成一个新的有序序列
列表自身有一个成员函数sort(),是基于自己本身修改,并不会生成新的对象

a = [5, 3, 2, 1]                                                                
a.sort()                                                                        
print a

执行结果:

[1, 2, 3, 5]
  • 基于列表实现堆栈

stack

a = []                                                                          
a.append(8)  # push操作                                                         
a.pop()      # pop操作                                                          
print a[-1]  # top操作                                                          

queue


a = []                                                                          
a.appen(3)  # push操作                                                          
a.pop(0)    # pop操作                                                           
print a[0]  # front操作 
  • 列表的深浅拷贝问题
    这是一个比较难理解的问题

先来看这个例子:

a = [3, [3, 4]]                                                                                                                           
b = a        # 直接赋值法                                                                                                                 
c = list(a)  # 使用工厂函数list()                                                                                                         
d = a[:]     # 切片                                                                                                                       


# 打印出各个列表的id                                                                                                                      
print id(a)                                                                                                                               
print id(b)                                                                                                                               
print id(c)                                                                                                                               
print id(d)                                                                                                                               


# 将a 中的**数字**元素进行修改之后,查看各个列表是否变化                                                                                       
a[0] = 1                                                                                                                                  
print a                                                                                                                                   
print b                                                                                                                                   
print c                                                                                                                                   
print d                                                                                                                                   

# 将a 中的**列表元素**进行修改后,查看各个列表是否变化                                                                                        

a[1][0] = 1000                                                                                                                            
print a                                                                                                                                   
print b                                                                                                                                   
print c                                                                                                                                   
print d                                                                                                                                   

print id(a[1])                                                                                                                            
print id(b[1])                                                                                                                            
print id(c[1])                                                                                                                            
print id(d[1])     

执行结果:

140570408003272
140570408003272
140570408021888
140570408020808
[1, [3, 4]]
[1, [3, 4]]
[3, [3, 4]]
[3, [3, 4]]
[1, [1000, 4]]
[1, [1000, 4]]
[3, [1000, 4]]
[3, [1000, 4]]
140570408054864
140570408054864
140570408054864
140570408054864

我们发现

  • a 和 b 是同一个对象(id 相同,修改任何类型的值,都是同变化的)
  • c 和 d 与 a 不是同一个对象(id 不相同)
  • c 和 d 在修改列表中的列表元素时也跟着变化了
  • b 、c、d 中的列表元素的 id 都和 a 相同

    接下分析:
    浅拷贝是:拷贝的新对象中的子对象和原来对象里面的子对象不是同一个对象(id 不相同)
    深拷贝是:拷贝的新对象,同时新对象中的子对象也是重新创建了一份新的深拷贝对象
    总结:上面的3种拷贝方法,都是浅拷贝

  • 深拷贝通过copy.deepcopy来完成

import copy                                                                     
a = [9, [2, 3]]                                                                 
b = copy.deepcopy(a)                                                            

print a                                                                         
print b                                                                         

print id(a)                                                                     
print id(b)                                                                     

print id(a[1])                                                                  
print id(b[1])

执行结果:

[9, [2, 3]]
[9, [2, 3]]
140435273709256
140435273711488
140435273710408
140435273747344

我们看到 a[1] 和 b[1] 不再是同一个对象了

  • 不止是列表,其他容器,例如元组,字典也存在类似的深拷贝问题,原理和列表相同
  • 但是也并不是说,调用deepcopy就一定会执行深拷贝,Python解释器自己会根据具体的情况
    例如,下面的例子
import copy                                                                     
a = (100, 'cccc')                                                               
b = copy.deepcopy(a)                                                            
print a                                                                         
print b                                                                         
print id(a)                                                                     
print id(b)                                                                     
print id(a[1])                                                                  
print id(b[1]) 

执行结果:
发现并没有进行深拷贝

(100, 'cccc')
(100, 'cccc')
140527276675872
140527276675872
140527276804064
140527276804064

其实也很好理解,元组是不可修改类型,深拷贝是为了防止修改之后影响其他对象,元组不存在这个问题,深拷贝的话比较浪费资源。

完。

上一篇:

下一篇: