day06

1. 小数据池

1.1 前提条件

  • 只针对int,str,bool

1.1.1 int 的范围 -5~256 ,cmd 终端验证

  • 赋值:判断两边的值是否相等
a = 100
b = 100
print(id(a),id(b))   #id相同
print(a == b)      #结果:True  
  • 下边将介绍大于256其实id也相同,属于代码块定义

1.1.2 str: 字符串从以下几个方面介绍

  • is 是基于内存地址进行判断的
  • 字符串长度为0或者1,默认都采用了驻留机制(小数据池)

  • 字符串长度>1,且只含有大小写字母,数字,下划线时,默认驻留

  • 用乘法得到的字符串,分两种情况

    • 乘数小于1时

      • 仅含大小写字母,数字,下划线,默认驻留
      • 含其他字符,长度<=1,默认驻留
    • 乘数>=2时,

      • 仅含大小写字母,数字,下划线,总长度<=20,默认驻留

      • a = "www.python.com" * 3
        b = "www.python.com" * 3
        print(a is b)  #结果:False
        print(id(a),id(b))	#867652581584 867652581968
        
    • 以上为True,其他为False

1.2 练习

a = "wusir你好" *1 #  1或0
b = "wusir你好" *1
print(id(a))  #257789114576
print(id(b))  #257789114576
print(a is b) #True
a = "wusir你好" *2
b = "wusir你好" *2
print(id(a))  #438334254696
print(id(b))  #438334940328
print(a is b) #False

2.深浅拷贝

2.1 浅拷贝

2.1.11.赋值 使用的是同一个内存空间,没有开辟新的

lst = ["太白","wusir","大黑",["刘备","关羽","张飞"]]
lst1 = lst
print(lst)  #['太白', 'wusir', '大黑', ['刘备', '关羽', '张飞']]
print(lst1)  #['太白', 'wusir', '大黑', ['刘备', '关羽', '张飞']]

lst.remove("wusir")
print(lst)   #['太白', '大黑', ['刘备', '关羽', '张飞']]
print(lst1)   #['太白', '大黑', ['刘备', '关羽', '张飞']]

lst[-1].remove("刘备")
print(lst)   #['太白', 'wusir', '大黑', ['关羽', '张飞']]
print(lst1)  ##['太白', 'wusir', '大黑', ['关羽', '张飞']]

![

2.1.2 浅拷贝 浅拷贝的时候,只会开辟一个新的容器列表,其他元素使用的都是源列表中的元素

lst = ["太白","wusir","大黑",["刘备","关羽","张飞"]]
lst1 = lst.copy()
print(id(lst))   #453267241096
print(id(lst1))  #453268052936    #id 不同

print(id(lst[1]))     #112526459880
print(id(lst1[1]))    #112526459880  ##id 相同

print(id(lst[-1]))    #957977868168
print(id(lst1[-1]))   #957977868168   #id 相同

lst[-1].append(666)
#lst1[-1].append(666)
print(lst)
print(lst1)    
 结果      #都改变
['太白', 'wusir', '大黑', ['刘备', '关羽', '张飞', 666]]
['太白', 'wusir', '大黑', ['刘备', '关羽', '张飞', 666]]

lst.append(666)    
lst[1] = 666    
print(lst)
print(lst1)  #结果都在lst上改变,lst1不变

lst1.append(666)
lst1[1] = 666
print(lst)
print(lst1)    #结果都在lst1上改变,lst不变

# 浅拷贝的时候只拷贝第一层元素
# 浅拷贝在修改第一层元素(不可变数据类型)的时候,拷贝出来的新列表不进行改变
# 浅拷贝在替换第一层元素(可变数据类型)的时候,拷贝出来的新列表不进行改变
# 浅拷贝在修改第一层元素中的元素(第二层)的时候,拷贝出来的新列表进行改变

2.2 深拷贝

lst = ["太白","wusir","大黑",["刘备","关羽","张飞"]]
import copy
lst1 = copy.deepcopy(lst)
print(id(lst))   #1022631491464
print(id(lst1))  #1022633789128    #id 不相同

print(id(lst[1]))     #174734607336
print(id(lst1[1]))    #174734607336  ##id 相同

print(id(lst[-1]))    #1092954896456
print(id(lst1[-1]))   #1092957194120   #id 不相同

无论lst还是lst1都再互不影响
# 深拷贝开辟一个容器空间(列表),不可变数据公用,可变数据数据类型(再次开辟一个新的空间),空间里的值是不可变的数据进行共用的,可变的数据类型再次开辟空间

3. 集合 (set)

3.1 没有值得字典 ,无序,不支持索引

3.2 特性:天然去重,即没有重复的元素

s = {1,"alex","北京",(1,2,3),12,1,4,"北京"}
print(s)
#结果
#{1, 4, 12, '北京', (1, 2, 3), 'alex'}  无序且没有重复的

3.4 面试题

lst = [1,2,1,2,4,2,45,3,2,45,2345]
print(set(lst))           #{1, 2, 3, 4, 2345, 45}
print(list(set(lst)))     #[1, 2, 3, 4, 2345, 45]

s = set(lst)
lst1 = list(s)
print(lst1)

扩展
s = set(lst)
lst1 = list(s)
print(lst1)
lst1 = [1, 2, 3, 4, 2345, 45]
lst1.sort()   #升序
print(lst1)	  #[1, 2, 3, 4, 45, 2345]
lst1.sort(reverse=True)  #倒序
print(lst1)   #[2345, 45, 4, 3, 2, 1]
lst = lst1    #重新赋值
print(lst)   #[2345, 45, 4, 3, 2, 1]

3.5 集合的增删改查

# 增:
# s.add("67")  #只能添加一个
# print(s)
# s.update("今天")  # 迭代添加
# print(s)

# 删:
# print(s.pop())  # pop有返回值
# print(s)
# s.remove(3)     # 指定元素删除
# print(s)
# s.clear()         # 清空   -- set() 空集合
# print(s)

# 改:
# 先删在加

# 查:
# for i in {1,2,3}:
#     print(i)

# 其他操作:
# s1 = {1,2,3,4,5,6,7}
# s2 = {5,6,7,1}
# print(s1 & s2)  # 交集
# print(s1 | s2)  # 并集
# print(s1 - s2)  # 差集
# print(s1 ^ s2)  # 反交集
# print(s1 > s2)  # 父集(超集)
# print(s1 < s2)  # 子集

# print(frozenset(s1))  # 冻结集合 更不常用
# dic = {frozenset(s1):1}
# print(dic)
posted @ 2019-07-12 21:32  lvweihe  阅读(85)  评论(0编辑  收藏  举报