基础数据类型的补充以及深浅copy

元组
如果元组中只有一个数据,且没有逗号,则该‘元组’与里面的数据的数据类型相同。

tu1 = (1)
tu2 = (1,)
print(tu1, type(tu1))
print(tu2, type(tu2))
tu3 = ('alex')
tu4 = ('alex',)
tu5 = ([1,2,3])

print(tu3, type(tu3))
print(tu4, type(tu4))
print(tu5, type(tu5))

  

列表
列表与列表可以相加

l1 = [1, 2, 3]
l2 = ['alex', 'wusir']
l3 = l1 + l2
print(l3)

  

在循环一个列表时,最好不要对此列表进行改变大小(增删)操作

l1 = [11, 22, 33, 44, 55, 66, 77]
# 将列表中索引为奇数的元素全部删除

# 方法一:切片+步长删除
# del l1[1::2]
# print(l1)


# for i in l1:
#     if l1.index(i) % 2 ==1:
#         l1.pop(l1.index(i))
# print(l1)

'''
# 在循环一个列表时,如果对列表中的某些元素进行删除,
# 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
'''

# 方法二  将元素取出来添加到新列表,再将新列表赋值到原列表

l1 = [11, 22, 33, 44, 55, 66, 77]
l2 = []
for i in range(len(l1)):
    if i % 2 == 0:
        l2 .append(l1[i])
print(l2)
l1 = l2
print(l1)


# 方法三  倒着删除

l1 = [11, 22, 33, 44, 55, 66, 77]
for index in range(len(l1)-1, -1, -1):
    if index % 2 == 1:
        l1.pop(index)
print(l1)

  

ic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}

# 将dic的键中含有k元素的所有键值对删除
'''
for k in dic:
    if "k" in k:
        del dic[k]
print(dic)

报错原因:dictionary changed size during iteration
在循环一个字典中,不能改变字典的大小。

  

字典面试题:创建字典的方式

1.
dic = {'name':'alex'}

2. 
dic = dict({'name':'alex'})

3.fromkeys
'''
# fromkeys()
dic1 = dict.fromkeys([1, 2, 3], 'alex')
print(dic1)   #{1: 'alex', 2: 'alex', 3: 'alex'}

# 陷阱
dic2 = dict.fromkeys([1, 2, 3], [])
print(dic2)   #{1: [], 2: [], 3: []}
dic2[1].append('alex')
print(dic2)   #{1: ['alex'], 2: ['alex'], 3: ['alex']}
print(id(dic2[1]))   #2304578552072  对应同一地址
print(id(dic2[2]))
print(id(dic2[3]))

数据类型的转换
int str bool 三者转换
str <--> bytes
str <--> list

dict.key() dict.values() dict.item() 都可以转换成列表

tuple <--> list
dic --> lsit

# str --->lsit
s1 = 'alex wuris taibai'
l1 = s1.split()
print(l1)
# list --->str  前提此list中的元素全部都是str类型
l1 = ['alex', 'wuris', 'taibai']
s1 = ' '.join(l1)
print(s1)


# list --->tuple
l1 = [1, 2, 3]
tu1 = tuple(l1)

# tuple ---> list
tu2 = (1,2,4)
l1 = list(tu2)
print(l1)

  

集合与深浅copy

set = {'alex', 'wusir', 1, 2, 3}

集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。
集合里面的元素不重复(天然去重),无序。

主要用途:
1.去重
2.关系测试

list去重*****
l1 = [1,1,2,3,4,5,4,6,1,2,2]
set1 = set(l1)
l2 = list(set1)
print(set1)
 
# 增
set1 = {'alex','wusir','ritian','egon','barry'}
set1.add('景女神')
print(set1)
 
#update:迭代着增加
set1.update('A')
print(set1)
set1.update('老师')
print(set1)
set1.update([1,2,3])
print(set1)
 
# 删
set1 = {'alex','wusir','ritian','egon','barry'}
 
set1.remove('alex')  # 删除一个元素
print(set1)
 
set1.pop()  # 随机删除一个元素
print(set1)
 
set1.clear()  # 清空集合
print(set1)
 
# del set1  # 删除集合
# print(set1)
 
 
# 关系测试
# 交集
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)
print(set1.intersection(set2))
 
# 并集
print(set1|set2)
print(set1.union(set2))
 
#反交集
print(set1 ^set2)
print(set1.symmetric_difference(set2))
 
# 差集
print(set1 - set2)
print(set1.difference(set2))
 
# 子集与超集
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
 
print(set1 < set2)
print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。
 
print(set2 > set1)
print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。
 
# 将集合变成不可变 ***
set1 = frozenset(set1)
print(set1)

浅copy:第一层在内存中独立的,从第二层开始以及更深的层数,都使用同一个内存地址,一变都变  

# 浅copy
l1 = [1, 2, 3]
l2 = l1.copy()
print(l2)
print(id(l1))
print(id(l2))
l1 = [1, 2, 3, [22,55]]
l2 = l1.copy()
l1[-1].append(666)
 
print(l1)
print(l2)
print(id(l1)) #地址不一样
print(id(l2))
 
print(id(l1[-1]))  #地址一样
print(id(l2[-1]))

  

深copy:这两个是完全独立的,互不影响

import copy
l1 = [1, 2, 3, [22,55]]
l2 = copy.deepcopy(l1)
l1[-1].append(666)
 
print(l1)
print(l2)
print(id(l1)) #地址不一样
print(id(l2))
 
print(id(l1[-1]))  #地址不一样
print(id(l2[-1]))
 
 
'''
应用场景:面试会考,解释深浅copy
    完全独立的copy一份数据,与原数据没有关系,深copy
    如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy
     
面试题2:
 
'''
# 面试题2: 切片属于浅copy
l1 = [1, 2, 3, [22, 33]]
l2 = l1[:]
# l1.append(66)
print(l1)
print(l2)
# l1[-1].append(666)
print(l2)

  

 

  

原文地址:https://www.cnblogs.com/eaoo/p/9455398.html