pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17
章節號
內容
1圖片格式(png)
寬度大于620px,保持高寬
第1章節? import模塊
1-1?import模塊—sys.path
↓import導入模塊的搜索路徑:
In [1]: import sys
In [2]: sys.path
Out[2]:
#第一個為當前路徑
['',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/home/li/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/usr/lib/python3/dist-packages',
'/usr/lib/python3/dist-packages/IPython/extensions',
'/home/li/.ipython']
In [3]:
↓添加一條搜索路徑:
In [4]: sys.path.append("/home")
In [5]: sys.path
Out[5]:
['',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/home/li/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/usr/lib/python3/dist-packages',
'/usr/lib/python3/dist-packages/IPython/extensions',
'/home/li/.ipython',
'/home']
In [6]:
↓sys.path的一些用法:
1-2?import模塊—重新導入模塊
1、自定義模塊并導入:
↓在某路徑下,新建一個test.py文件,輸入以下代碼:
vim test.py
1 def test():
2 print("test import")
↓在sys.path中添加當前路徑,便可導入使用:
In [1]: import sys
In [2]: sys.path
Out[2]:
['',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/IPython/extensions',
'/home/li/.ipython']
In [3]: sys.path.append("/home/li")
In [4]: sys.path
Out[4]:
['',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/IPython/extensions',
'/home/li/.ipython',
'/home/li']
In [5]: import test
In [6]: test.test()
test import
In [7]:
↑退出后path的添加會失效,再次使用需要再次導入。
2、重新導入模塊reload(模塊)
應用場景:在導入一個模塊后,該模塊代碼被修改,如果不重新導入,則新修改的代碼無法使用。再次使用import也不能完成預期,正確做法為:
In [7]: reload(test)
Out[7]:
1-3?import模塊—模塊的循環導入問題
什么是循環導入?
我用你,我導入你。同時你也用我,你導入我。
from 模塊名 import 函數名
root@li-ThinkPad-T420s:/home/li# cat test.py
from text import text
def test():
print("test import")
text()
test()
root@li-ThinkPad-T420s:/home/li# cat text.py
from test import test
def text():
print("text import")
test()
text()
root@li-ThinkPad-T420s:/home/li#
root@li-ThinkPad-T420s:/home/li# python test.py
Traceback (most recent call last):
File "test.py", line 1, in
from text import text
File "/home/li/text.py", line 1, in
from test import test
File "/home/li/test.py", line 1, in
from text import text
ImportError: cannot import name text
root@li-ThinkPad-T420s:/home/li#
↑從設計角度來說,這種情況要嚴格避免。
第2章節? == 和 is
==是判斷值是否相同
is是判斷id是否相同(是否指向同一個東西)
In [20]: a=[1,2]
In [21]: b=[1,2]
In [22]: a is b
Out[22]: False
In [23]: id(a)
Out[23]: 140065919094080
In [24]: id(b)
Out[24]: 140065919170680
In [25]: a == b
Out[25]: True
↓注意這個問題,數字在負的X到正的X這一范圍內,所有的id會變成相同的,超過這個范圍則會不同。切記。
In [26]: a = 100
In [27]: b = 100
In [28]: a == b
Out[28]: True
In [29]: a is b
Out[29]: True
In [30]: a=10000
In [31]: b=10000
In [32]: id(a)
Out[32]: 94786674642736
In [33]: id(b)
Out[33]: 94786674642640
第3章節? 深拷貝和淺拷貝
3-1?深拷貝和淺拷貝—深和淺的不同
1、深:我拿到了數據(copy.deepcopy)。改一個,另一個不變。
In [35]: a=[1,2,3]
In [39]: import copy
In [40]: b=copy.deepcopy(a)
In [41]: id(a)
Out[41]: 140065900535752
In [42]: id(b)
Out[42]: 140065909328424
#深拷貝
2、淺:我只拿到了地址。改一個,另一個也跟著變。
In [35]: a=[1,2,3]
In [36]: b=a
In [37]: id(a)
Out[37]: 140065900535752
In [38]: id(b)
Out[38]: 140065900535752
#淺拷貝
3-2?深拷貝和淺拷貝—多重引用下的深拷貝
深拷貝對多重引用會自動進行遞歸拷貝,一直到最底層。
In [55]: a
Out[55]: [1, 2, 3, 4]
In [56]: b
Out[56]: [1, 2, 3]
In [57]: c=[a,b]
In [58]: c
Out[58]: [[1, 2, 3, 4], [1, 2, 3]]
In [59]: d=c
In [60]: id(c)
Out[60]: 140065909614568
In [61]: id(d)
Out[61]: 140065909614568
In [62]: e=copy.deepcopy(c)
In [63]: id(e)
Out[63]: 140065909636632
In [64]: id(e[0])
Out[64]: 140065919104784
In [65]: id(c[0])
Out[65]: 140065900535752
In [66]: id(d[0])
Out[66]: 140065900535752
In [67]: e
Out[67]: [[1, 2, 3, 4], [1, 2, 3]]
3-3?深拷貝和淺拷貝—copy和deepcopy
copy模塊中,還有一個copy.copy函數。
In [70]: a=[1,2]
In [71]: b=[3,4]
In [72]: c=[a,b]
In [73]: c
Out[73]: [[1, 2], [3, 4]]
In [74]: d=copy.copy(c)
In [75]: d
Out[75]: [[1, 2], [3, 4]]
In [76]: id(c)
Out[76]: 140065919152424
In [77]: id(d)
Out[77]: 140065918710200
In [78]: id(c[0])
Out[78]: 140065919059368
In [79]: id(d[0])
Out[79]: 140065919059368
copy()只識別第一層引用。
deepcopy()識別所有引用,一直到最底。
3-4?深拷貝和淺拷貝—copy()元組時特點
In [81]: a
Out[81]: [1, 2]
In [82]: b
Out[82]: [3, 4]
In [83]: c=(a,b)
In [84]: d=copy.copy(c)
In [85]: id(c)
Out[85]: 140065900473808
In [86]: id(d)
Out[86]: 140065900473808
In [87]: id(c[0])
Out[87]: 140065919059368
In [88]: id(d[0])
Out[88]: 140065919059368
In [89]: id(c[0][0])
Out[89]: 94786668758568
In [90]: id(d[0][0])
Out[90]: 94786668758568
元組本身是不可變類型,copy()判斷出是不可變類型,第一層引用都不深入拷貝。copy()判斷出是可變類型,深入拷貝第一層。
copy模塊的功能一定要慎用,想清楚再用!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps怎么引出说明(ps怎么引出标注)
- 下一篇: src获取同级目录中的图片_一个简单的P