???作者簡介:大家好,我是愛敲代碼的小王,CSDN博客博主,Python小白
??系列專欄:python入門到實戰(zhàn)、Python爬蟲開發(fā)、Python辦公自動化、Python數(shù)據(jù)分析、Python前后端開發(fā)
??如果文章知識點有錯誤的地方,請指正!和大家一起學(xué)習(xí),一起進(jìn)步??
??如果感覺博主的文章還不錯的話,請??三連支持??一下博主哦
??博主正在努力完成2023計劃中:以夢為馬,揚帆起航,2023追夢人
?????? python入門到實戰(zhàn)專欄:從入門到實戰(zhàn)
?????? Python爬蟲開發(fā)專欄:從入門到實戰(zhàn)
?????? Python辦公自動化專欄:從入門到實戰(zhàn)
?????? Python數(shù)據(jù)分析專欄:從入門到實戰(zhàn)
?????? Python前后端開發(fā)專欄:從入門到實戰(zhàn) ? ?
目錄
變量的作用域(全局變量和局部變量)
參數(shù)的傳遞
淺拷貝和深拷貝
參數(shù)的幾種類型?
變量的作用域(全局變量和局部變量)
變量起作用的范圍稱為變量的作用域,不同作用域內(nèi)同名變量之間 互不影響。變量分為:全局變量、局部變量。
全局變量:
1 在函數(shù)和類定義之外聲明的變量。作用域為定義的模塊,從定義位置開始直到模塊結(jié)束。
2 全局變量降低了函數(shù)的通用性和可讀性。應(yīng)盡量避免全局變量的使用。
3 要在函數(shù)內(nèi)改變?nèi)肿兞康闹?,使?global 聲明一下
局部變量:
1 在函數(shù)體中(包含形式參數(shù))聲明的變量。
2 局部變量的引用比全局變量快,優(yōu)先考慮使用
3 如果局部變量和全局變量同名,則在函數(shù)內(nèi)隱藏全局變量,只使用同名的局部變量
【操作】全局變量的作用域測試
a = 100 #全局變量
def f1():
global a #如果要在函數(shù)內(nèi)改變?nèi)肿兞康闹?,增加global關(guān)鍵字聲明
print(a) #打印全局變量a的值
a = 300
f1()
f1()
print(a)
?執(zhí)行結(jié)果:
100
300
【操作】全局變量和局部變量同名測試
a=100
def f1():
a = 3 #同名的局部變量
print(a)
f1()
print(a) #a仍然是100,沒有變化
?執(zhí)行結(jié)果:
3
100
【操作】 輸出局部變量和全局變量
a = 100
def f1(a,b,c):
print(a,b,c)
print(locals()) #打印輸出的局部變量
print("#"*20)
print(globals()) #打印輸出的全局變量
f1(2,3,4)
輸出結(jié)果:
2 3 4
{'c': 4, 'b': 3, 'a': 2}
####################
{'__name__': '__main__', '__doc__': None,
'__package__': None, '__loader__': <class
'_frozen_importlib.BuiltinImporter'>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (builtin)>, '__file__':
'E:\\PythonExec\\if_test01.py', 'a': 100,
'f1': <function f1 at 0x0000000002BB8620>}
實時效果反饋
1. 如下關(guān)于全局變量和局部變量的說法,錯誤的是:
A 全局變量:在函數(shù)和類定義之外聲明的變量。作用域從定義位 置開始直到模塊結(jié)束
B 局部變量:在函數(shù)體中(包含形式參數(shù))聲明的變量
C 如果局部變量和全局變量同名,則在函數(shù)內(nèi)隱藏全局變量,只 使用同名的局部變量
D 局部變量的引用和全局變量一樣快
局部變量和全局變量效率測試
局部變量的查詢和訪問速度比全局變量快,優(yōu)先考慮使用,尤其是在循環(huán)的時候。
在特別強調(diào)效率的地方或者循環(huán)次數(shù)較多的地方,可以通過將全局
變量轉(zhuǎn)為局部變量提高運行速度。
【操作】測試局部變量和全局變量效率?
import time
a = 1000
def test01():
start = time.time()
global a
for i in range(100000000):
a += 1
end = time.time()
print("耗時{0}".format((end-start)))
def test02():
c = 1000
start = time.time()
for i in range(100000000):
c += 1
end = time.time()
print("耗時{0}".format((end-start)))
test01()
test02()
print(globals())
運行結(jié)果:
耗時5.278882026672363
耗時3.6103720664978027
參數(shù)的傳遞
函數(shù)的參數(shù)傳遞本質(zhì)上就是:從實參到形參的賦值操作。Python中 “一切皆對象”,所有的賦值操作都是“引用的賦值”。所以,Python 中參數(shù)的傳遞都是“引用傳遞”,不是“值傳遞”。
具體操作時分為兩類:
1 對“可變對象”進(jìn)行“寫操作”,直接作用于原對象本身。
2 對“不可變對象”進(jìn)行“寫操作”,會產(chǎn)生一個新的“對象空間”,并用新的值填充這塊空間。?
可變對象有: 字典、列表、集合、自定義的對象等
不可變對象有: 數(shù)字、字符串、元組、function等?
傳遞可變對象的引用
傳遞參數(shù)是可變對象(例如:列表、字典、自定義的其他可變對象 等),實際傳遞的還是對象的引用。在函數(shù)體中不創(chuàng)建新的對象拷貝,而是可以直接修改所傳遞的對象。
【操作】參數(shù)傳遞:傳遞可變對象的引用
b = [10,20]
def f2(m):
print("m:",id(m)) #b和m是同一個對象
m.append(30) #由于m是可變對象,不創(chuàng)建對象拷貝,直接修改這個對象
f2(b)
print("b:",id(b))
print(b)
執(zhí)行結(jié)果:
m: 45765960
b: 45765960
[10, 20, 30]
實時效果反饋
1. 列表是可變對象,關(guān)于參數(shù)傳遞可變對象,說法錯誤的是:
b = [10,20]
def f2(m):
print("m:",id(m))
m.append(30)
f2(b)
A b和m是同一個對象
B b和m是不同的對象
C 對“可變對象”進(jìn)行“寫操作”,直接作用于原對象本身
D f2(b) 把 b 傳遞給 m 的過程中,沒有創(chuàng)建對象的拷貝
傳遞不可變對象的引用
傳遞參數(shù)是不可變對象(例如: int 、 float 、字符串、元組、布爾值),實際傳遞的還是對象的引用。在”賦值操作”時,由于不可變 對象無法修改,系統(tǒng)會新創(chuàng)建一個對象。
【操作】參數(shù)傳遞:傳遞不可變對象的引用
a = 100
def f1(n):
print("n:",id(n)) #傳遞進(jìn)來的是a對象的地址
n = n+200 #由于a是不可變對象,因此創(chuàng)建新的對象n
print("n:",id(n)) #n已經(jīng)變成了新的對象
print(n)
f1(a)
print("a:",id(a))
執(zhí)行結(jié)果:
n: 1663816464
n: 46608592
300
a: 1663816464
顯然,通過 id 值我們可以看到 n 和 a 一開始是同一個對象。給n賦值 后,n是新的對象。
實時效果反饋
1. 數(shù)字是不可變對象,關(guān)于參數(shù)傳遞不可變對象并且要修改原對 象,說法錯誤的是:
a = 100
def f1(n):
n = n+200
f1(a)
A 代碼執(zhí)行完后, b 和 n 是同一個對象
B 代碼執(zhí)行完后, b 和 n 是不同的對象
C 對“不可變對象”進(jìn)行“寫操作”,創(chuàng)建新的對象
D 執(zhí)行 n=n+200 時,創(chuàng)建了新的對象
淺拷貝和深拷貝
?為了更深入的了解參數(shù)傳遞的底層原理,我們需要講解一下“淺拷貝 和深拷貝”。我們可以使用內(nèi)置函數(shù): copy (淺拷貝)、 deepcopy (深拷貝)。
?1、淺拷貝:拷貝對象,但不拷貝子對象的內(nèi)容,只是拷貝子對象的引用。
2、深拷貝:拷貝對象,并且會連子對象的內(nèi)存也全部(遞歸)拷貝一份,對子對象的修改不會影響源對象
#測試淺拷貝和深拷貝
import copy
def testCopy():
'''測試淺拷貝'''
a = [10, 20, [5, 6]]
b = copy.copy(a)
print("a", a)
print("b", b)
b.append(30)
b[2].append(7)
print("淺拷貝......")
print("a", a)
print("b", b)
def testDeepCopy():
'''測試深拷貝'''
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)
print("a", a)
print("b", b)
b.append(30)
b[2].append(7)
print("深拷貝......")
print("a", a)
print("b", b)
testCopy()
print("*************")
testDeepCopy()
運行結(jié)果:
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
淺拷貝......
a [10, 20, [5, 6, 7]]
b [10, 20, [5, 6, 7], 30]
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
深拷貝......
a [10, 20, [5, 6]]
b [10, 20, [5, 6, 7], 30]
實時效果反饋
1. 如下關(guān)于淺拷貝和深拷貝,錯誤的是:
A 淺拷貝使用函數(shù): copy (淺拷貝)
B 淺拷貝:拷貝對象,也全部拷貝子對象
C 深拷貝:拷貝對象,也全部拷貝子對象
D 深拷貝使用函數(shù): deepcopy (深拷貝)
傳遞不可變對象包含的子對象是可變的情況
#傳遞不可變對象時。不可變對象里面包含的子對象是可變的。則方法內(nèi)修改了這個可變對象,源對象也發(fā)生了變化。
a = (10,20,[5,6])
print("a:",id(a))
def test01(m):
print("m:",id(m))
m[2][0] = 888
print(m)
print("m:",id(m))
test01(a)
print(a)
運行結(jié)果:
a: 41611632
m: 41611632 (10, 20, [888, 6])
m: 41611632 (10, 20, [888, 6])
參數(shù)的幾種類型?
位置參數(shù)?
函數(shù)調(diào)用時,實參默認(rèn)按位置順序傳遞,需要個數(shù)和形參匹配。按 位置傳遞的參數(shù),稱為:“位置參數(shù)”。
【操作】測試位置參數(shù)
def f1(a,b,c):
print(a,b,c)
f1(2,3,4)
f1(2,3) #報錯,位置參數(shù)不匹配
執(zhí)行結(jié)果:
2 3 4
Traceback (most recent call last):
File "E:\PythonExec\if_test01.py", line 5,
in <module>
f1(2,3)
TypeError: f1() missing 1 required positional
argument: 'c
默認(rèn)值參數(shù)
我們可以為某些參數(shù)設(shè)置默認(rèn)值,這樣這些參數(shù)在傳遞時就是可選 的。稱為“默認(rèn)值參數(shù)”。默認(rèn)值參數(shù)放到位置參數(shù)后面。
【操作】測試默認(rèn)值參數(shù)
def f1(a,b,c=10,d=20): #默認(rèn)值參數(shù)必須位于普通位置參數(shù)后面
print(a,b,c,d)
f1(8,9)
f1(8,9,19)
f1(8,9,19,29)
執(zhí)行結(jié)果:
8 9 10 20
8 9 19 20
8 9 19 29
命名參數(shù)
我們也可以按照形參的名稱傳遞參數(shù),稱為“命名參數(shù)”,也稱“關(guān)鍵 字參數(shù)”。
def f1(a,b,c):
print(a,b,c)
f1(8,9,19) #位置參數(shù)
f1(c=10,a=20,b=30) #命名參數(shù)
執(zhí)行結(jié)果:
8 9 19
20 30 10
實時效果反饋
1. 如下函數(shù)定義后,調(diào)用時,錯誤的是:
def f1(a,b,c=10,d=20): #默認(rèn)值參數(shù)必須位于普通位置參數(shù)后面
print(a,b,c,d)
A f1(5)
B f1(5,6)
C f1(5,6,7,8)文章來源:http://www.zghlxwxcb.cn/news/detail-615992.html
D f1(b=5,a=6,d=7,c=8)文章來源地址http://www.zghlxwxcb.cn/news/detail-615992.html
到了這里,關(guān)于Python入門【變量的作用域(全局變量和局部變量)、參數(shù)的傳遞、淺拷貝和深拷貝、參數(shù)的幾種類型 】(十一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!