1樓:柒澀琴
你直接定義的localvar是個全域性變數;而test()這個函式中會定義(或重繫結)全域性變數localvar為6。
可以這樣理解:函式是一個盒子,所有函式體裡定義的變數都只能在盒子裡存在。但是global關鍵字讓函式可以定義能拿到盒子外的變數(所以,如果變數名字相同,後來的賦值操作就會覆蓋之前的值,這和你在盒子外面的行為是一樣的)。
>>> def box():
localvar = 6
>>> def box_with_a_global_var():
global globalvar
globalvar = 6
>>> localvar = 5
>>> box()
>>> localvar
5>>> box_with_a_global_var()>>> globalvar = 5
>>> globalvar5
2樓:匿名使用者
首先,python執行過程是順序執行的!這可能是lz疑慮的地方
順序執行是指處於同一作用域下**才順序執行,比如這裡,test函式定義、localvar=5(賦值)、test()函式呼叫操作、print localvar列印這幾個操作是同一作用域,而函式內的語句則屬於test函式的子域。
按照順序,首先執行的語句是localvar=5,這個時候函式還沒呼叫呢,不會執行localvar=6,然後才呼叫test函式,global localvar,這裡申明函式內用的是localvar全域性,好了,執行localvar=6,這裡全域性的localvar被重新賦值了!函式內的print語句,列印結果是重新複製後的6,函式呼叫完,繼續執行函式最後一個print語句,列印全域性localvar,還是為6
3樓:
把test()放localvar = 5上邊先執行就可以了~
python 全域性變數怎麼用
4樓:匿名使用者
在python中,全域性變數一般有兩種使用方式:
第一種:是在一個單獨的模組中定義好,然後在需要使用的全域性模組中將定義的全域性變數模組匯入。
第二種:直接在當前的模組中定義好,然後直接在本模組中通過global宣告,然後使用
具體的方法如下所示:
第一種:
#輸出:
ps:在此種用法中,如果我們在函式tt中不使用global 宣告全域性變數solr_url,其實也可以使用,但是此時應該是作為一個內部變數使用,由於沒有初始值,因此報錯
python查詢變數是順序是:先區域性變數,再全域性變數
#輸出:
solr_url=solr_url+'#aa'
unboundlocalerror: local variable 'solr_url' referenced before assignment
第二種:
global_list.py
global_a='hello'
global_b='world'
test.py
import global_list
def tt():
print global_list.global_a
if __name__=='__main__':
tt()
#輸出:
hello
python中的本地變數(local variable)和全域性變數(global variable)分別是什麼?
5樓:尐二瓜
python中直接定義的變數就是本地變數,使用global定義的變數就是全域性變數。比如:
a = 1
b = 1
def foo1():
global b #申明使用全域性b
a = 2 #a是本地變數
b = 2 #b是全域性變數
foo1()
print a
print b
如果解決了您的問題請採納!
如果未解決請繼續追問
6樓:咋就那麼難
全域性變數能在區域性使用,但是在區域性宣告的變數不能在外部(比如迴圈外部)使用
python中怎麼定義全域性變數
7樓:匿名使用者
複製**
count = 0
def fuc(count):
print count
count += 1
for i in range(0, 10):
fuc(count)
複製**
結果是:
不是我們想要的結果。
解決之道一——全域性變數:
複製**
global a
a = 3
def fuc():
global a
print a
a = a + 1
if __name__ == "__main__":
global a
for i in range(10):
fuc()print 'hello'
print a
複製**
結果:注意要領:
**需要全域性變數,**宣告一下;但是函式千萬不要傳引數, fuc(a)是不行的。
解決之道二——列表:
複製**
a = [3]
def fuc():
print a[0]
a[0] = a[0] + 1
if __name__ == "__main__":
global a
for i in range(10):
fuc()
print 'hello'
print a[0]
複製**
結果同上
列表可以比肩簡單的實現,學習之。
8樓:唯美逛
在python中,全域性變數一般有兩種使用方式: 第一種:是在一個單獨的模組中定義好,然後在需要使用的全域性模組中將定義的全域性變數模組匯入。
第二種:直接在當前的模組中定義好,然後直接在本模組中通過global宣告
9樓:士飛薇武鈞
接下來,我們把值2賦給x。x是函式的區域性變數。所以,當我們在函式內改變x的值的時候,在主塊中定義的x不受影響。
在最後一個print語句中,我們證明了主塊中的x的值確實沒有受到影響。
使用global語句
如果你想要為一個定義在函式外的變數賦值,那麼你就得告訴python這個變數名不是區域性的,而是
全域性的。我們使用global語句完成這一功能。沒有global語句,是不可能為定義在函式外的變數賦值的。
你可以使用定義在函式外的變數的值(假設在函式內沒有同名的變數)。然而,我並不鼓勵你這樣做,並且你應該儘量避免這樣做,因為這使得程式的讀者會不清楚這個變數是在**定義的。使用global語句可以清楚地表明python函式變數是在外面的塊定義的。
python中在哪些情況下必須使用global來宣告全域性變數
10樓:天天不看
以下是一個多執行緒的python**片段,其中的x,l都是全域性變數,但在threadcode()函式中只宣告瞭global x沒有global l。完整的**是可以成功執行,但是把global x註釋掉後就會報錯。這是為什麼,lock物件比較特殊嗎?
[python] view plain copy
import threading, time, sys
x = 50
l = threading.lock()
def threadcode():
global x
l.acquire()
print 'thread %s invoked.' % threading.currentthread().getname()
try:
print 'thread %s running.' % threading.currentthread().getname()
x = x + 50
print 'thread %s set x to %d.' % \
(threading.currentthread().getname(), x)
finally:
l.release()
......
推廣一下,就成了在什麼情況下必須使用global宣告全域性變數的問題。這段**不用在函式中宣告global x也可以列印出x的值
[python] view plain copy
x = 20
def getx():
print x
getx()
在segmentfault上提問,得到了這樣的回答
[plain] view plain copy
對於python2而言,對於一個全域性變數,你的函式裡如果只使用到了它的值,而沒有對其賦值(指a = ***這種寫法)的話,就不需要宣告global。相反,如果你對其賦了值的話,那麼你就需要宣告global。宣告global的話,就表示你是在向一個全域性變數賦值,而不是在向一個區域性變數賦值。
這樣一來就清楚了。原因想來應該是這樣,如果在函式內對一個全域性變數賦值而沒有提前宣告的話,它會被當成一個與全域性變數同名的區域性變數,像這樣
[python] view plain copy
x = 20
def getx():
x = 50
print x
getx()#print 50
所以如果把第一段**中的global x註釋掉,執行到x = x + 50就報錯,因為這裡的x既不是全域性變數,也沒有作為區域性變數被初始化。而對於l,因為它是一個物件,呼叫物件成員函式和訪問普通變數的值一樣,所以也不需要事先宣告其為全域性變數,就像下面這樣。
[python] view plain copy
class a:
def __init__(self, x):
self.x = x
def setx(self, x):
self.x = x
a = a(50)
def func():
a.setx(20)
print a.x
func()#print 20
11樓:育知同創教育
你的問題中已經說了啊!就是當它作為全域性變數的時候!
舉個例子來說,當你有一個引數在一個方法中會被改變,如果你希望把這個改變給積累下來,而不是每一次都是從頭開始變化的話,那麼這個引數就需要宣告為全域性變數
12樓:匿名使用者
當你在一個程式中用了它給它賦值,並且要用賦值後的它,那麼就必須要global了。本來它只是local的引用和賦值,不會影響其他程式的使用,但global之後就會影響程式外的值
全域性變數和靜態全域性變數的區別,靜態全域性變數和全域性變數有什麼區別
全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有...
python使用多程序時,全域性變數改了,為什麼在函式a中值沒
在子程序引用宣告變數的模組,然後直接用.引用就更新了 用python的tkinter中的按鈕,繫結的事件如何更改全域性變數的問題 from tkinter import def changestringvar a.set changed print a.get 在這print a.get 就能列印在...
全域性變數無法賦值
num3只是形參,只是在函式呼叫中讀取了全域性變數l的值,其是一個獨立的變數,有著獨立的儲存單元。num3的改變和 l 是沒有什麼關係的 請好好看看形參和實參的那一節 num3只是形參,只是在函式呼叫中讀取了全域性變數l的值,其是一個獨立的變數,有著獨立的儲存單元。num3的改變和 l 是沒有什麼關...