python深浅拷贝

字节与字符串的关系:8byte = 1kb,字节是计算机内的最小单位,字符串是能看到的最小单位

list的特殊情况

li1 = [11,22,33,44,55]  #循环删除,每一个元素
for i in range(leng(li1)) :
    del li1[i]
    print(i)
    print(li1)

$列表分配索引超出范围
0
[22, 33, 44, 55]
1
[22, 44, 55]
2
[22, 44]
$IndexError: list assignment index out of range

分析原因:
第一次循环当i等于0时删除索引为0的元素22,列表变为[22, 33, 44, 55]
第二次循环当i等于1时删除索引为1的元素33,列表变为[22, 44, 55]
第三次循环当i等于2时删除索引为2的元素55,列表变为[22, 44]
第四次循环当i等于3时删除索引为3的元素不存在,报错
列表可变每次删除元素,列表都发生变化,导致出现上面问题

删除列表方法:

1.采用倒序删除法
li1 = [11,22,33,44,55] for i in range(len(li1)-1,-1,-1) : del li1[i] print(li1)
2.使用深拷贝先定义范围,再循环删除
lis = [11,22,33,44,55]
import copy
for i in copy.deepcopy(lis) :
lis.remove(i)
print(lis)

习题:删除列表奇数位(二种方法)

li1 = [11,22,33,44,55]
li1 = li1[1::2]
print(li1)

$[22, 44]
li1 = [11,22,33,44,55]
for i in range(len(li1)-1,-1,-2) :
del li1[i]
print(li1)
$[22, 44]

分析题:

lis = [11,22,33,44,55]
for i in lis :
   lis.pop()
print(lis)

$[11,22]
$为什么不会全部删除
$第一次进入循环i等于11,删除最后一个元素55,列表变为[11,22,33,44]
$第二次进入循环i等于22,删除最后一个元素44,列表变为[11,22,33]
$第三次进入循环i等于33,删除最后一个元素33,列表变为[11,22]
$第四次进入循环列表元素改变,不会再次循环

这样可以解决问题
for i in range(len(lis)) :
lis.pop()
print(lis)

dict的特殊情况

#dict.fromkeys(seq[,value])
dict1 = dict.fromkeys('asdfasdf]')

${'a': None, 's': None, 'd': None, 'f': None, ']': None}

#易范错误
dic = dict.fromkeys([1,2,3],'春哥')
dic = dict.fromkeys([1,2,3],[])
print(dic) 

${1:[],2:[],3:[])

dic[1].append('abc')
dic[2].extend('二哥')

${1: ['abc', '二', '哥'], 2: ['abc', '二', '哥'], 3: ['abc', '二', '哥']}

字典的删除

#循环删除字典中键中包含'K‘的键值对(两种方法)
dic1 = {'k1':'v1','k2':'v2','a3':'v3'}
li1 = []
for key,value in dic1.items() :
   if 'k' not in key :
      li1.append({key:value})
print(li1)

#能过列表操作字典
dic1 = {'k1':'v1','k2':'v2','a3':'v3'}
li1 = []
for key in dic1 :
   if 'k' in key :
      li1.append(key)
for i in li1 :
   del dic1[i]
print(dic1)

基本数据类型bool值为False的情况

print(bool(0),bool(''),bool([]),bool(()),bool({}),bool(set()))

$False False False False False False

集合

可变的数据类型,集合元素必须是不可变数据类型,无序,集合自动去重复

基本操作:
set1 = set({1,2,3})
set2 = set{1,2,3,[2,3],{'name':'alex'}}   错

print(set1)	打印无序
增
set.add('')  
set.update('')
删
set.pop	随机删除,有返回值
set.remove	按元素删除,没有元素报错
set.clear()	清空列表
$set()	空集合,{}空字典
del set	整删除,报错
改
不可变数据类型,无序不能改
for i in set:
       print(i)

比较方法:

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
#交集 &
set3 = set1 & set2
#并集(所有元素)  |   union(联合)
set3 = set1 | set2 
#反交集 ^ symmetric_difference
set3 = set1 ^ set2 
#差集	第一个集合独有
set3 = set1 - set2
#子集和超集    <  issubset  issuperset

集合方法:

集合本身是可变数据类型,可以使用frozense()将集合冻住

深浅拷贝  

l1 =  [1,2,3]
l2 = l1
l1.append('a')
print(l1,l2)

#浅拷贝copy
l1 = [1,2,3]
l2 = l1.copy()
print(l1,l2,l1 is l2)
l2.append('a')
print(l1,l2)

l1 = [1,2,[4,5,6],3]
l2 = l1.copy()
print(l1,l2,l1 is l2)
l2.append('a')
print(l1,l2)

l1[2].append('a')
print(l1,l2)
print(id(l1[2]),id(l2[2]))

#深拷贝copy
#import coyp
l1 = [1,2,3]
l2 = copy.deepcopy(l1)

枚举类型enumerate  

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

enumerate(sequence, [start=0])

li = ['a','b','c','d']
for index,value in enumerate(li) :
            print(index,value)
#数字列可以设置开头列
for index,value in enumerate(li,100) :
            print(index,value)

  

posted @ 2017-12-22 15:00  wsg-python  阅读(158)  评论(0编辑  收藏  举报