深浅拷贝

内存相关

  • 练习1的输出的结果有666(内部修改)
    • 因为v1、v2指定的是同一处内存
  • 练习2赋值而不修改内存地址
    • 重新赋值结果不变,修改内部元素结果改变
练习1
v1=[11,22,33]
v2=v1
v1.append(666)
print(v2)
结果为[11,22,33,666]

练习2
v1= [11,22,33]
v2=v1
v1=[1,2,3]
print(v2)
结果为[11,22,33]

练习3
v = [1,2,3]
value = [1,2,v]
v = [4,5,6]
print(value)
结果为:[1,2,[1,2,3]]

练习4
v = [1,2,3]
value=[1,2,v]
value[2]=666
print(v)
结果为[1,2,3]
  • print(id())
    • 查看内存地址

python的小数据池

  • python为了优化性能,认为常用数字(-5~256)或者字符串使用频率较高,便不再开辟新的内存
    • 列表、字典、集合不会存在此现象
v1=1
v2=1
id(vi) = id(v2)

问题:== 与 is的区别

  • == 是值相当
  • is 是内存地址相等

深浅拷贝

  • 浅拷贝:只拷贝数据的第一层

  • 深拷贝:拷贝嵌套层次的所有的数据(可变)

  • 对于字符串、布尔类型、整型深浅拷贝是没有区别的

v1 = [1,2,3,4,[1,2,3]]
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
print(id(v1[4]),id(v2[4]))
60886984 60920712
30792744 30792744
v1 = [1,2,3,4,[1,2,3]]
import copy
v2 = copy.deepcopy(v1)
print(id(v1),id(v2))
print(id(v1[4]),id(v2[4]))
60985416 60886984
60985640 60985672
  • 可以看出浅拷贝只拷贝最外层,也就是说最外层地址不一样,而内部元素的地址是一样的
  • 深拷贝拷贝嵌套内的,在无嵌套时,深浅拷贝是一样的
  • 对于元组而言,如果没有可变元素,地址不变,里面有可变类型,其所嵌套的地址改变
  • 字典中,键可以直接循环,值不可以
info = {'name':'王钢蛋','sex':'女'}
if i  in info:
print('在')
  • 判断”王钢蛋“是否在字典的值中
flag = True
info = {'name':'王钢蛋','sex':'女'}
for i in info.values():
    if '王钢蛋'== i:
        flag = True
        break
if flag:
    print('在')
else:
    print('不再')
  • 判断一个字符串是不是集合
v1 = {'杨大大',,"常大大","李太白"}
if type(v1)== set:
    print("这是集合")
else:
    print("这不是集合")

  • 输出的结果均不变,注意与列表区分开
v1 = "yang"
v2 = v1
v1.upper()
print(v2,v1)
posted @ 2020-06-16 00:23  小杨的冥想课  阅读(100)  评论(0编辑  收藏  举报