python怎麼使用全域性變數

2021-10-10 07:44:21 字數 3829 閱讀 4527

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,這時可能導致程式中的錯誤。這種錯誤是很難發現和更正的。全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域...