1、在函式外部定義x = 6
2、在函式內部再次定義global x
x =
6def
func()
:global x #定義外部的x
x =1func(
)print
(x)#輸出1
如果沒有在函式內部global
修飾,那麼會在函式內部定義乙個同名區域性變數並隱藏掉同名全域性變數。
為全域性變數定義乙個「全域性變數管理模組」,下面主要建立了4個檔案
多執行緒操作全域性緩衝區時,最好增加同步鎖lock()
# main.py
import threading
import os
import global_maneger
from thread1 import modifycount
from thread2 import printcount
if __name__ ==
"__main__"
:print
('主程序pid=%d'
%os.getpid())
global_maneger.set_global_buffer(
'rx_buffer',[
0]) global_maneger.set_global_value(
'count',10
)#建立執行緒,此執行緒修改全域性變數
t1=threading.thread(target=modifycount)
#建立執行緒,此執行緒列印全域性變數
t2=threading.thread(target=printcount)
t1.start(
) t2.start(
) t1.join(
) t2.join(
)print
("主線程結束"
, global_maneger.get_global_buffer(
'rx_buffer'))
# global_maneger.py
import threading
_global_value_dict =
_global_buffer_dict =
buffer_lock = threading.lock(
)def
set_global_value
(key, value)
:""" 定義乙個全域性變數 """
global _global_value_dict
_global_value_dict[key]
= value
defget_global_value
(key, defvalue=
none):
""" 獲得乙個全域性變數,不存在則返回預設值 """
global _global_value_dict
try:return _global_value_dict[key]
except keyerror:
return defvalue
defset_global_buffer
(key, array)
:global _global_buffer_dict
buffer_lock.acquire(
) _global_buffer_dict[key]
= array
buffer_lock.release(
)def
get_global_buffer
(key)
:global _global_buffer_dict
buffer_lock.acquire(
) result = _global_buffer_dict[key]
buffer_lock.release(
)return result
# thread2.py
import threading
import time
import global_maneger
defprintcount()
:#獲取當前執行緒物件
t=threading.current_thread(
)for index in
range
(global_maneger.get_global_value(
'count'))
:print
('%s 列印buffer\n'
%t.name, global_maneger.get_global_buffer(
'rx_buffer'))
time.sleep(
0.1)
# thread1.py
import threading
import time
import global_maneger
defmodifycount()
:#獲取當前執行緒物件
t = threading.current_thread(
)for index in
range
(global_maneger.get_global_value(
'count'))
:print
('%s 修改buffer\n'
%t.name)
array = global_maneger.get_global_buffer(
'rx_buffer'
) global_maneger.set_global_buffer(
'rx_buffer'
, array)
time.sleep(
0.1)
main的執行結果:
主程序pid=8168
thread-1 修改buffer
thread-2 列印buffer
[0, 0]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2, 3]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2, 3, 4]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2, 3, 4, 5]
thread-2 列印buffer
thread-1 修改buffer
[0, 0, 1, 2, 3, 4, 5]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2, 3, 4, 5, 6, 7]
thread-2 列印buffer
thread-1 修改buffer
[0, 0, 1, 2, 3, 4, 5, 6, 7]
thread-1 修改buffer
thread-2 列印buffer
[0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
主線程結束 [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
process finished with exit code 0
python全域性變數的使用
問題提出,怎麼記錄漢諾塔問題中盤子移動的次數?def hanu n,a,b,c if n 1 print move a,c return hanu n 1,a,c,b print move a,b hanu n 1,b,a,c print move b,c hanu 2,a b c 思來想去,還是使...
python 全域性變數
應該盡量避免使用全域性變數。不同的模組都可以自由的訪問全域性變數,可能會導致全域性變數的不可預知性。對全域性變數,如果程式設計師甲修改了 a的值,程式設計師乙同時也要使用 a,這時可能導致程式中的錯誤。這種錯誤是很難發現和更正的。全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域...
Python 全域性變數
應該盡量避免使用全域性變數。不同的模組都可以自由的訪問全域性變數,可能會導致全域性變數的不可預知性。對全域性變數,如果程式設計師甲修改了 a的值,程式設計師乙同時也要使用 a,這時可能導致程式中的錯誤。這種錯誤是很難發現和更正的。全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域...