問題的引出:
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的嗎?假如某乙個全域性變數定義在最底部,那麼上面的那些...