莫烦python基础教程(十二)

深复制与浅复制、多线程、tkinter 模块

copy & deepcopy 浅复制 & 深复制


id

  • Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。
  • 一个对象的id值在CPython解释器里就代表它在内存中的地址
>>> import copy
>>> a = [1, 2, 3]
>>> b = a
>>> id(a)
2330827996232
>>> id(b)
2330827996232
>>> id(a) == id(b)  # 复制后,两者的id相同,为true。
True
>>> b[0] = 22222  # 此时,改变b的第一个值,也会导致a值改变。
>>> print(a, b)
[22222, 2, 3] [22222, 2, 3]

浅拷贝

  • 当使用浅拷贝时,python只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已
>>> import copy
>>> a = [1, 2, 3]
>>> c = copy.copy(a)  # 拷贝了a的外围对象本身。
>>> id(c)
2330828059336
>>> print(id(a) == id(c))  # id改变为false
False
>>> c[1] = 22222  # 此时,改变c的第二个值时,a不会被改变。
>>> print(a, c)
[1, 2, 3] [1, 22222, 3]

深拷贝

  • deepcopy对外围和内部元素都进行了拷贝对象本身,而不是对象的引用
>>> import copy
>>> a = [1, 2, [3, 4]]  
# 第三个值为列表[3, 4],即内部元素。
>>> d = copy.copy(a)  
# 浅拷贝a中的[3, 4]内部元素的引用,非内部元素对象的本身。
>>> id(a) == id(d)
False
>>> id(a[2]) == id(d[2])
True
>>> a[2][0] = 3333  
# 改变a中内部原属列表中的第一个值。
>>> d  
# 这时d中的列表元素也会被改变。
[1, 2, [3333, 4]]
>>> e = copy.deepcopy(a)  
# e为深拷贝了a。
>>> a[2][0] == 333  
# 改变a中内部元素列表第一个的值。
False
>>> e
[1, 2, [3333, 4]]
# 因为是深拷贝,这时e中内部元素和列表的值不会因为a中的值改变而改变。

多线程


threading

  • 多线程 Threading 是一种让程序拥有分身效果. 能同时处理多件事情。
  • 一般的程序只能从上到下一行行执行代码, 不过 多线程 (Threading) 就能打破这种限制。

multiprocessing

  • 多线程 (Threading) 是有劣势的,GIL 让它没能更有效率的处理一些分摊的任务。
  • 现在的电脑大部分配备了多核处理器,多进程能让电脑更有效率的分配任务给每一个处理器,这种做法解决了多线程的弊端,也能很好的提升效率。

tkinter模块


窗口视窗

  • Tkinter 是使用 python 进行窗口视窗设计的模块。
  • 它的优点是构造简单, 多平台, 多系统的兼容性。
  • 它在 python 窗口视窗模块中是一款简单型的模块,能让你快速入门定制窗口文件。

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/82142646
今日推荐