深拷贝和浅拷贝

import copy

# 浅拷贝
print("浅拷贝:")
a = [1, 2, 3]
b = a
a.append(4)
print(a, "-" * 5, b)
print(id(a), "=" * 5, id(b))
print("结论:a、b指向同一内存空间,并没有新开辟空间")

# 深拷贝
print("*" * 60)
print("深拷贝:")
a = [1, 2, 3]
b = copy.deepcopy(a)
a.append(4)
print(a, "-" * 5, b)
print(id(a), "=" * 5, id(b))
print("结论:b新建的一内存空间,里面的值即为a指向的内存空间的值")

# 进一步理解拷贝
print("*" * 60)
print("进一步理解拷贝:")
print("浅拷贝:")
a = [1, 2, 3]
b = [4, 5, 6]
c = [a, b]
d = c
b.append(7)
print(c, "-" * 5, d)
print(id(c), "=" * 5, id(d))
print("结论:这样的拷贝即浅拷贝,d、c指向同一内存空间")

print("*" * 30)
print("深拷贝:")
d = copy.deepcopy(c)
b.append(8)
print(c, "-" * 5, d)
print(id(c), "=" * 5, id(d))
print("结论:d新建的一个内存空间,内存空间里面呢,又指向了两个新的列表,这两个新的列表里面放的是a、b的值(都是全新的)")

print(" *" * 30)
print("补充:(这个牛逼了,半深半浅的拷贝)")
d =copy.copy(c)
b.append(9)
print(c, "-" * 5, d)
print(id(c), "=" * 5, id(d))
print("结论:d新建了一个内存空间,内存空间里面有两个指针,它呢,"
      "它指向的还是原来的a、b,不是新的a、b(copy.copy()仅仅只对c做了一层判断,元组浅拷贝,列表深拷贝)")

# 拷贝的其他形式
# 浅拷贝对不可变类型和可变类型的copy不同
print("*" * 60)
print("可变类型:")
a = [1,2,3]
b = copy.copy(a)
a.append(4)
print(a, "-" * 5, b)
print(id(a), "=" * 5, id(b))

print()
print("不可变类型(元组):")
a = (1,2,3)
b = copy.copy(a)
print(id(a), "=" * 5, id(b))
print("结论:可变类型的copy新建的一个内存空间,不可变类型的copy还是指向原来的内存空间")

 

posted @ 2018-11-12 17:23  人工智能之路上的菜鸡  阅读(124)  评论(0编辑  收藏  举报