python全域性變數的一些思考

2021-08-09 04:03:50 字數 1737 閱讀 7933

問題的引出:

x =

5def

func()

: x *= x

print

(x)func(

)

報錯資訊

traceback (most recent call last):

file "new 2.py", line 5, in func()

file "new 2.py", line 3, in func

x *= x

unboundlocalerror: local variable 'x' referenced before assignment

這裡為什麼說x在賦值前被引用錯誤呢?明明我宣告了乙個全域性變數x啊(這是乙個c/c++程式設計師的想法_!!!),在c語言中這樣做確實沒有問題。如下:

int x =5;

void

fun(

void

)int

main

(void

)

但是為什麼在python裡面就行不通了呢?

python裡面的變數有些類似於c語言中的指標變數,你這樣一想的話,有些問題就明白了。比如說為什麼python裡面的list可以容納不同型別的變數?又比如說python裡面變數宣告時不區分型別?另外,還要知道的一點是,python在賦值時,會為數值分配一塊記憶體空間,然後通過變數去指向這塊記憶體空間。如果修改變數的值,實際上就是變數指向了不同的記憶體空間。如下:

>>

> a =

1>>

>

id(a)

1802679360

>>

> a =

3>>

>

id(a)

1802679424

ok,回到原來的問題。x*=x相當於x = x*x,也就是左邊的x指向了右邊生成的記憶體空間,這裡要注意,前後x指向的記憶體發生了變化,如下

x =

5def

func()

:global x

print(id

(x))

x*=x

print(id

(x))

print

(x)func(

)

結果是

1802679488

1802680128

25

當這個變數在右邊的時候相當於取記憶體操作,python裡面如果要對乙個全域性變數取記憶體操作的話,必須要提前宣告這個變數是global的,也就是上面**裡的做法。關鍵問題來了,我函式裡的x不可以取外面x的記憶體裡的東西嗎?可以!!!

x =

5print(id

(x))

deffunc()

:print(id

(x))

print

(x)func(

)

結果是

1802679488

1802679488

5

並沒有出現問題,而且前後的x是同乙個,而且我沒有宣告global。分析這個例子和上面的例子不難發現問題所在,問題出現在這個賦值操作上。所以我們大致總結為以下幾點:

全域性變數的一些注意

源自csdn的帖子裡面的內容,目前在用全域性變數,但還沒有出錯,留個記號,已備以後使用。現在貼上主要 c c code pragma data seg shared hhook g hook null hwnd g hwnd null log loguser critical section sec...

獲取一些全域性變數的方法。

獲取全域性session mapsession map actioncontext.getcontext getsession 從session中拿到登陸使用者資訊 admin admin admin session.get sessionoperator servletcontext contex...

關於全域性變數,區域性變數的一些看法!!!

1,全域性變數,和區域性變數的生存週期咋樣呢,儲存位置呢?2,假如全域性變數和區域性變數定義賦值都是一樣的,那麼printf函式裡呼叫變數會出現什麼結果?把區域性變數去掉呢?3,對於乙個c c 程式而言,全域性變數真的只是定義在所有函式之外就ok的嗎?假如某乙個全域性變數定義在最底部,那麼上面的那些...