我們首先看一下變數的分類,通常情況下,我們所說到的定義乙個變數,如果沒有特殊說明,那麼就是定義乙個全域性變數。
全域性變數
在模組內、在所有函式外面、在class外面,這就是全域性變數
區域性變數
在函式內、在class的方法內(未加self修飾),這就是區域性變數
靜態變數
在class內的,但不在class的方法內的,這就是靜態變數
例項變數
在class的方法內的,用self修飾的變數,這就是例項變數
全域性變數
全域性變數供全域性共享,全域性類和函式均可訪問,達到同步作用。同時還可以被外部檔案訪問。
使用全域性變數使用的時候,需要用global顯示宣告。
一般情況下,如果函式直接呼叫全域性變數,不做更新的話,一般沒有問題,但如果有重新賦值,又沒有在函式內部使用 global宣告的話, 就相當於在內部建立了乙個同名的區域性變數,區域性變數優先順序要高於全域性變數。
# coding:utf-8
_all =
'helloworld'
# 全域性變數
_all_list =
# 全域性變數
defprintall()
:global _all # 這裡需要用global顯示宣告
print _all # helloworld
區域性變數
# coding:utf-8
defshow()
: city =
'beijing'
# 區域性變數
print city
靜態變數
可以稱為是類變數,通過類名可以直接訪問,也可以通過例項名直接訪問,此變數在類中全域性共享,例項之間也是全域性共享。可以看下面例項
# coding:utf-8
class
foo:
all=
0def
add(self)
: foo.q +=1
instance01 = foo(
)# 例項化物件1
instance02= foo(
)# 例項化物件2
print instance01.
all# 執行結果為:0
print instance02.
all# 執行結果為:0
print foo.
all# 執行結果為:0
instance01.add(
)print instance01.
all# 執行結果為:1
print instance02.
all# 執行結果為:1
print foo.
all# 執行結果為:1
instance02.add(
)print instance01.
all# 執行結果為:2
print instance02.
all# 執行結果為:2
print foo.
all# 執行結果為:2
例項變數
對於模組來說,有了自己的全域性變數,可以供自己內部的類,函式使用,同步;對於函式或者類方法來說,有了自己的區域性變數,供自己內部使用;對於類,有了靜態變數,可以供內部和有繼承關係的父子之際使用,同步;但例項之間各自的私有變數(區域性變數)就要靠例項變數了,實現了動態繫結,多型特性。
用self來修飾
# coding:utf-8
class
foo:
all=
0def
__init__
(self, name)
: self.name = name
defadd(self)
: foo.q +=1
instance01 = foo(
'hello'
)instance02 = foo(
'hi'
)print instance01.name # hello
print instance02.name # hi
print foo.name # attributeerror:class foo has no attribute 'name'
總結
在整個**組織的過程中,一般會有這樣兩種基本需求,私有 和 公有。
私有不與其他共享,自己獨享,如函式和方法的區域性變數,例項變數
公有需要在一定範圍內共享,達到同步目的,如模組內的**共享的全域性變數,類與子類之間共享的靜態變數。
如何在類中定義常量?
如果你想得到乙個可用於常量表示式中的常量,例如陣列大小的定義,那麼你有兩種選擇 那麼,為何要有這些不方便的限制?因為類通常宣告在標頭檔案中,而標頭檔案往往被許多單 元所包含。但是,為了避免鏈結器設計的複雜化,c 要求每個物件都只能被定義一次。如果c 允許類內定義要作為物件被存在記憶體中的實體,那麼這...
如何在 Python 中清屏
在很多時候,如果我們在控制台中使用 python,隨著時間的推移,可能會發現螢幕越來越亂。如下圖,我們跑了不少的測試程式,在螢幕上有很多的輸出。在 windows 中,我們會使用 cls 命令清屏。在 python,應該怎麼樣才能清屏呢?其實 python 並沒有清螢幕的命令,也沒有內建內建命令可以...
如何在 block 中修改外部變數
lock 的目的是為了支援並行程式設計,對於普通的 local 變數,我們就不能在 block 裡面隨意修改 原因很簡單,block 可以被多個執行緒並行執行,會有問題的 而且如果你在 block 中修改普通的 local 變數,編譯器也會報錯。那麼該如何修改外部變數呢?有兩種辦法,第一種是可以修改...