導航:首頁 > 編程語言 > python變數范圍

python變數范圍

發布時間:2023-05-13 01:14:22

python局部變數與全局變數

(1)局部變數 是在 函數內部定義的變數,只能在函數內部使用
(2)函數執行結束後,函數內部的局部變數,會被系統回收
(3)不同的函數,可以定義相同的名字的局部變數,不會互相影響

示例:

結果:

所謂生命周期就是變數從被創建到被系統回收的過程
(1)局部變數在函數執行時才會被創建
(2)函數執行結束後,局部變數被系統回收
(3)局部變數在生命周期內,可以用來存儲函數內部臨時使用到的數據

示例:

結果:

示例:

結果:

示例:

結果:

(1)為了避免局部變數和全局變數出現混淆,在定義全局變數時,有些公司會有一些開發要求,例如:全局變數名前加上gl_或者g_的前綴,但不同公司可能不一致;
(2)建議全局變數的命名與局部變數的規則區分開;

❷ python中變數的引用、可變和不可變類型、局部變數和全局變數

變數的引用

變數和數據都是保存在內存中的

變數和數據是分開存儲的

數據保存在內存中某個位置,通過地址來標記

變數保存的是數據的地址,通過地址可以找到數據在內存空間的位置

把變數保存數據地址的過程稱為引用


變數的重新賦值修改的是變數中引用數據的內存地址

變數之間的賦值實際是引用的傳遞

函數參數的傳遞,本質也是引用的傳遞

函數的返回值本身也是引用的傳遞


可變和不可變類型

不可變類型,內存中的數據不允許被修改:數字類型(int,bool,float,complex,long(2,x)、字元串、元組(tuple)

可變類型,內存中的數據可以被修改:列表list、字典dict

無論是可變還是不可變數據類型,通過賦值語句,都會改變變數的引用


Hash函數只能接收不可變數據類型,字典的鍵也只能是不可變數據類型,字典的value值可以是任意數據類型


局部變數

1.在函數內部定義的變數就是局部變數(作用范圍只能是當前函數內部)

2.在函數外部無法直接訪問局部變數

3.不同的函數中可以定義同名的局部變數

4.局部變數的生命周期:從定義變數時開始,到函數運行結束

全局變數

1.在所有函數外邊定義的變數就是全局變數

2.讓所有函數都能訪問到,可以作為函數通信的橋梁

3.一般情況下,為了和普通變數的區別,需要加上g_或gl_前綴

4.全局變數一般放在所有函數的最上面

5.在函數內部修改全局變數,必須要加上global關鍵字,如果不加global只是定義了一個同名的局部變數


函數的多個返回值

❸ #抬抬小手學Python# Python 之作用域下的 global 和 nonlocal 關鍵字

該部分內容涉及 Python 變數作用域相關知識,變數作用域指的是變數的有效作用范圍,直接理解就是 Python 中的變數不是任意位置都可以訪問的,有限制條件。

一般情況下變數的作用域變化范圍是 塊級、函數、類、模塊、包等,級別是從小到達。Python 中是沒有塊級作用域的,所以我們在寫代碼的時候,下面的代碼是正確的。

在 Python 中常見的塊級作用域有 if 語句、for 語句、while 語句、with 上下文語句。

上文已經提及了作用域是 Python 程序可以直接訪問一個變數的作用范圍,Python 的作用域一共有 4 種,分別如下:

一個比較經典的案例如下:

在 Python 中變數尋找的順序是從內到外,先局部,然後外部,在全局,在內建,這種規則叫做 LEGB 規則 。

增加以下學習的趣味性,你可以研究下述代碼中變數是如何變化的。

定義在 函數內部 的變數擁有一個局部作用域,定義在 函數外部 的變數擁有全局作用域。

輸出結果,函數內部是 123 ,函數外部依舊是 0 。

如果希望函數內部(內部作用域)可以修改外部作用域的變數,需要使用 global 關鍵字。

此時輸出的就都是 123 了,還有一點需要注意,在函數內容如果希望修改全局變數的值, global 關鍵字一定要寫在變數操作前。

該代碼會出現語法錯誤:

全局變數還存在一個面試真題,經常出現,請問下述代碼運行結果。

如果要修改嵌套作用域(Enclosing 作用域)中的變數,需要 nonlocal 關鍵字,測試代碼如下:

輸出結果自行測試,注意 nonlocal 關鍵字必須是 Python3.X+版本,Python 2.X 版本會出現語法錯誤:

在多重嵌套中, nonlocal 只會上溯一層,如果上一層沒有,則會繼續上溯,下述代碼你可以分別注釋查看結果。

局部變數和全局變數具體有哪些,可以通過 locals() 和 globals() 兩個內置函數獲取。

本篇博客為大家說明了 Python 的作用域,並且對 global 和 nonlocal 關鍵字進行了學習,希望對你有所幫助。

❹ Python其實很簡單 第十二章 函數與變數的作用域

在前面已經多次提到函數這個概念,之所以沒有解釋什麼是函數,是因為程序中的函數和數學中的函數差不多,如input()、range()等都是函數,這些都是Python的標准函數,直接使用就可以了。根據需要,用戶也可以自定義函數。

12.1 函數

函數的結構:

def 函數名(參數):

函數體

return 返回值

例如:數學中的函數f(x)=2x+5在Python中可以定義如下:

def f(x):

y=2*x+5

return(y)

如果x取值為3,可以使用如下語句調用函數:

f(3)

下面給出完整的程序代碼:

def f(x):

y=2*x+5

return(y)

res=f(3)

print(res)

運行結果:11

如上例中的x是函數f(x)的參數,有時也被稱為形式參數(簡稱形參),在函數被調用時,x被具體的值3替換y就是函數的返回值,這個值3也被稱為實際參數(簡稱實參)。

上例中的y是函數f(x)的返回值。並不是所有的函數都有參數和返回值。如下面的函數:

def func():

print('此為無參數傳遞、無返回值的函數')

func()

輸出結果:此為無參數傳遞、無返回值的函數

可以看出,該函數func()無參數,故調用時不用賦給參數值。

函數也可以有多個參數,如f(x,y)=x²+y²,可用Python語言定義如下:

def f(x,y):

z=x**2+y**2

return z

print(f(2,3)) #調用函數f(x,y)

輸出結果:13

也可以通過直接給參數列表中的參數賦值的方法,為參數添加默認值,如果用戶賦予參數值,則按照用戶賦值執行,否則使用默認值。例如:

def f(x,y=3):

z=x**2+y**2

return z

若調用時參數列表為(2,1),即x賦值為2,y賦值為1:

print(f(2,1))

輸出結果為:5

若調用時參數列表為(2),即x賦值為2,y賦值省缺,則y使用默認值:

print(f(2))

輸出結果為:13

回調函數,又稱函數回調,是將函數作為另一函數的參數。

例如:

def func(fun,m,n):

fun(m,n)

def f_add(m,n):

print('m+n=',m+n)

def f_mult(m,n):

print('m*n=',m*n)

func(f_add,2,3)

func(f_mult,2,3)

輸出結果:

m+n= 5

m*n= 6

在f_add(m,n)和f_mult(m,n)被定義前,func(fun,m,n)中的fun(m,n)就已經調用了這兩個函數,即「先調用後定義」,這也是回調函數的特點。

如果無法預知參數的個數,可以在參數前面加上*號,這種參數實際上對應元組類型。譬如,參會的人數事先不能確定,只能根據與會人員名單輸入:

def func(*names):

print('今天與會人員有:')

for name in names:

print(name)

func('張小兵','陳曉梅','李大海','王長江')

運行後,輸出結果為:

今天與會人員有:

張小兵

陳曉梅

李大海

王長江

參數為字典類型,需要在參數前面加上**號。

def func(**kwargs):

for i in kwargs:

print(i,kwargs[i])

func(a='a1',b='b1',c='c1')

輸出結果為:

a a1

b b1

c c1

一個有趣的實例:

def func(x,y,z,*args,**kwargs):

print(x,y,z)

print(args)

print(kwargs)


func('a','b','c','Python','is easy',py='python',j='java',ph='php')

輸出結果:

a b c # 前三個實參賦給前三個形參

('Python', 'is easy') # *args接收元組數據

{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典數據

12.2 變數的作用域

變數的作用域即變數的有效范圍,可分為全局變數和局部變數。

局部變數

在函數中定義的變數就是局部變數,局部變數的作用域僅限於函數內部使用。

全局變數

在主程序中定義的變數就是全局變數,但在函數中用關鍵字global修飾的變數也可以當做全局變數來使用。

全局變數的作用域是整個程序,也就是說,全局變數可以在整個程序中可以訪問。

下面通過實例去討論:

程序1:

a=1 # a為全局變數

def a_add():

print('a的初值:',a) # 在函數中讀取a的值


a_add() # 調用函數a_add()

a+=1 # 主程序語句,a增加1

print('a現在的值是:',a) # 主程序語句,讀取a的值

運行結果:

a的初值: 1

a現在的值是: 2

這個結果和我們想像的一樣,全局變數a既可以在主程序中讀取,也可以在子程序(函數)中讀取。

程序2:

a=1

def a_add():

a+=1


print('a的初值:',a)

a_add()

print('a現在的值是:',a)

運行程序1時出現如下錯誤提示:

UnboundLocalError: local variable 'a' referenced before assignment

意思是:局部變數'a'在賦值之前被引用。

從語法上來講,該程序沒有錯誤。首先定義了一個全局變數a並賦值為1,又定義了一個函數a_add(),函數內的語句a+=1就是出錯的根源,雖然我們的初衷是想讓全局變數a的值增加1,但從錯誤提示看,這個語句中的a並不是全局變數,而是局部變數。看來,在函數中讀取全局變數的值是沒有問題的(在程序1中已經得到了驗證),但要在函數中改變全局變數的值是不行的(在程序2的錯誤提示a+=1中的a 是局部變數,而非全局變數)。

怎樣解決這個問題?

程序3:

a=1

def a_add(x):

x+=1

return x

print('a的初值:',a)

a=a_add(a)

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

結果的確是正確的,但在函數a_add(x)中沒有調用變數a(沒有出現變數a)。

程序4:

a=1

def a_add(a):

a+=1

return a

print('a的初值:',a)

a=a_add(a)

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

對比程序4和程序3不難發現,其實程序4隻是簡單的把函數的參數x變成了a,這個a的實質和程序3中的x還是一樣的。這進一步證實,函數中的a是局部變數,與主程序的全局變數a有著本質的區別。

程序5:

a=1

def a_add():

global a

a+=1


print('a的初值:',a)

a_add()

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

程序5和程序2相比較,僅僅是在函數中添加了一個定義「global a」,此時的局部變數a就可以當做全局變數使用,由於它和全局變數a同名,自然也就不用區分a究竟是全局變數還是局部變數了,在主程序和該函數內都可以訪問、修改變數a的值了。

雖然使用global可使變數使用起來非常方便,但也容易引起混淆,故在使用過程中還是謹慎為好。

12.3 函數的遞歸與嵌套

遞歸,就是函數調用它自身。遞歸必須設置停止條件,否則函數將無法終止,形成死循環。

以計算階乘為例:

def func(n):

if n==1:

return 1

else:

return n*func(n-1) #func( )調用func( )

print(func(5))

運行結果為:120

嵌套,指在函數中調用另外的函數。這是程序中常見的一種結構,在此不再贅述。

匿名函數

Python中可以在參數前加上關鍵字lambda定義一個匿名函數,這樣的函數一般都屬於「一次性」的。

例如:

程序1:這是一個常規的函數定義和調用。

def f_add(x,y):

return x+y

print(f_add(2,3))

輸出結果:5

程序2:使用lambda定義匿名函數。

f_add=lambda x,y:x+y

print(f_add(2,3))

輸出結果:5

從上面的代碼可以看出,使用lambda僅僅減少了一行代碼。f_add=lambda x,y:x+y中的f_add不是變數名,而是函數名。程序1和程序2的print( )語句中的參數都是一樣的——調用函數f_add( )。所以,匿名函數並沒有太多的優點。

❺ python語言的變數

1.Python 變數的概述:
變數,英文叫做 Variable。

從形式上看,每個變數都擁有獨一無二的名字,例如 a=1
a為變數,1 為值。
從底層看:程序中的數據都要放在內存條內,變數就是這塊內存的名字。

2.Python 變數的命名
變數名是標識符的一種,不能隨便起,必須要遵守 Python 標識符命名規則,
簡單理解:
標識符就是一個名字,它的主要作用就是作為變數、函數、類、模塊以及其他對象的名稱。
就好像我們人一樣,需要起個名字,便於稱呼、指代。
標識符命名規則:(簡稱駝峰命名)
標識符是由字母(A–Z 和 a–z)、下劃線和數字組成。如果標識符中出現除了這 3 類字元之外的其他字元,就肯定是不合法標識符。
標識符的第一個字元不能是數字。
標識符不能和 Python 關鍵字相同。
標識符中的字母是嚴格區分大小寫的。
以下劃線開頭的標識符有特殊含義,除非特定場景需要,應避免使用以下劃線開頭的標識符。
標識符可以是漢字。但我們應盡量避免使用漢字作為標識符,這會避免遇到很多沒必要的錯誤

❻ 淺談python中的變數賦值

在python中,變數賦值的語法比較簡單,語法就是 「變數名 = 對象」,由於python屬於動態語音,所以不需要像c、 java那樣在變數賦值時需要聲明變數的類型。

c 變數賦值

int x = 1;

python 變數賦值

x = 1

y = "hello world!"

a = [1, 2]

b = ('a', 'b')

c = {"foo": "bar"}

python 變數賦值中,所涉及到的變數命名是有一定規則的:

1. 變數名只能包含字母、數字和下劃線。變數名可以字母或下劃線開頭,但不能以數字開頭,例如,可將變數命名為name_1,但不能將其命名為1_name

2. 變數名不能包含空格,但可使用下劃線來分隔其中的單詞。例如,變數名name_one可行,但變數名name one會引發錯誤。

3. 不要將Python關鍵字和函數名用作變數名,即不要使用Python保留用於特殊用途的單詞,如not、pass等。

4. 變數名應既簡短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好, 雖說簡短好,但是不能依照自己的意願隨意簡寫,盡量使用大家約定俗成的簡寫,如果不是還不如寫全拼。

5. python 變數名中大小寫敏感,所以 NAME, Name, name 代表三個不同的表裡名, 這里提一下就是慎用小寫字母l和大寫字母O,因給他們可能被人錯看成數字1和0;

再說變數賦值中賦予給變數的值,python中萬事皆對象,所以python中只要是對象就能給變數賦值。如:

    x = 1 # x賦值為數字1;

    x = sum # x賦值為內建求和函數sum;

python的賦值真實上說應該不是賦值,而更像是「引用」,如何理解「引用」呢,python中一直對象的生成是會在內存中分配給一個內存地址,這個內存地址可以使用id()方法去獲取,然後在變數賦值時,將變數直接引用該對象的內存地址,進而完成變數賦值,如:

    x = 1, 賦值時x直接引用1所在內存的地址, y = x, 此時是y直接引用x的所指向的內存地址

python中有判斷變數的方法如 is() 和 ==,二者在判斷變數時是有區別的,is函數是判斷變數的內存地址是否相同,而 == 是判斷變數的值是否相同,舉例說明:

    a = 1; b = 1.0

    a is b  # False

    a == b # True

小心python變數賦值的陷阱

    看到上面的所述知道了python變數賦值實則是引用,引用的是對象的內存地址。所賦的值可以分兩類,一類是可變的,如列表,字典,集合;一類是不可變的,如字元串、元組。所以當對象為可變類型時就會出現一種情景,我們舉例說明:

    x = [1, 2, 3]

    y = x

    print x == y    # True

    print x is y    # True

    print x     # [1, 2, 3]

    print y     # [1, 2, 3]

    y.append(4)

    print x    # [1, 2, 3, 4]

    print y    # [1, 2, 3, 4]

可以看到y在進行調整時(添加了一個元素),x也跟著變動了,這進一步說明了,python中的變數賦值時引用,x,y 賦值時指向了同一處內存地址,所以當y變動時,x同樣也發送了變化,解決這中現象的方法可以是x, y = [1,2,3], [1,2,3]這樣賦值,雖說此時 x==y 是True,但是確實是2個不同的內存地址,所以 x is y 則是 False。或者可以使用模塊,實質是相同的,創建2個不同的內存地址,使其分離。

❼ Python中變數是什麼意思

變數

在Python中,存儲一個數據,需要定義一個變數

number1 = 1 #numbe1就是一個變數,用來保存數據:1

number2 = 2 #number2也是一個變數,用來保存數據:2

sum = number1+number2 #sum也是一個變數,用力保存1+2的值

相關推薦:《Python視頻教程》

說明:

所謂變數:就是可以改變的量。

程序就是用來處理數據的,而變數就是用來存儲數據的

python中的變數不需要指明類型,系統會自動識別

❽ python裡面變數作用域是什麼

變數作用域:python可以直接查找名稱到對象的映射(命名空間)的部分。

python有built–in、global、enclosing、local這四種作用域

built–in:內建作用域,包含了內建的變數和關鍵字。

global:全局作用域,定義在所有函數外,當前模塊(.py源文件)的全局變數。

enclosing:閉包函數外的函數(非局部也非全局),比如有一個函數a,a里有另一個函數b,對於b里的變數來說,a中的作用域就是enclosing。

local:局部作用域,腳本最內層,比如函數里。

❾ Python有全局變數嗎和C語言一樣的,在前面先聲明嗎可PYTHON語言不用聲明的,如何來定義全局變數

看作用域來確定變數范圍。
python有全變數,一般跟c裡面是一樣的
bar = 'python'
def foo1():
bar = 'hello' # 這里是局部變數
print(bar) # 打出hello,並且不會影響全局變數bar(全局那個bar仍然是'python')

def foo2():
print(bar) # 打出python # 因為沒有聲明局部變數所以python會搜索全局的bar,這個bar是全局的

def foo3():
global bar # 告訴python下面的bar是全局的
bar = 'hello' # 這里是全局變數
print(bar) # 打出hello,全局的bar已經改為hello不再是python了

閱讀全文

與python變數范圍相關的資料

熱點內容
cocos2dluapdf 瀏覽:489
假的加密鎖靠譜嗎 瀏覽:176
經營聖手伺服器怎麼調 瀏覽:749
arduino手機編程 瀏覽:481
西醫pdf下載 瀏覽:29
後浪電影學院pdf 瀏覽:813
程序員怎麼做到不被人嫉妒 瀏覽:669
cmd新建文件夾md命令 瀏覽:570
php數組中的數值排序 瀏覽:832
安卓手機怎麼避免小孩內購 瀏覽:171
聯想伺服器出現黃色嘆號怎麼辦 瀏覽:991
約翰編譯器製作教程 瀏覽:130
大地pdf 瀏覽:109
pdfplus 瀏覽:577
匯編O命令 瀏覽:970
plt轉pdf 瀏覽:364
魔獸60宏命令大全 瀏覽:478
php志願者網站源碼 瀏覽:874
貿易pdf 瀏覽:497
dbug命令 瀏覽:352