最初,星號變數是用在函式的引數傳遞上的,在下面的例項中,單個星號代表這個位置接收任意多個非關鍵字引數,在函式的*b位置上將其轉化成元組,而雙星號代表這個位置接收任意多個關鍵字引數,在**b位置上將其轉化成字典:
*該位置接受任意多個非關鍵字(non-keyword)引數,在函式中將其轉化為元組(1,2,3,4)
**該位置接受任意多個關鍵字(keyword)引數,在函式**位置上轉化為詞典 [key:value, key:value]
#!/usr/bin/env python
#coding=utf-8
#--------
def one(a,*b):
"""a是乙個普通傳入引數,*b是乙個非關鍵字星號引數"""
print(b)
one(1,2,3,4,5,6)
#--------
def two(a=1,**b):
"""a是乙個普通關鍵字引數,**b是乙個關鍵字雙星號引數"""
print(b)
two(a=1,b=2,c=3,d=4,e=5,f=6)
第乙個輸出為:
(2, 3, 4, 5, 6)
第二個輸出為:
從輸出中可以看到,第乙個函式中,*b的位置可以傳入任意多沒有關鍵字的引數,*b會將這些傳入引數轉化成乙個元組,下面的呼叫
其中,第乙個的輸入可以理解為:
one(
1
,
2
,
3
,
4
,
5
,
6
)
傳入後,等價於:
one(
1
,(
2
,
3
,
4
,
5
,
6
))
#第二個函式中,**b的位置可以接收任意多個關鍵字引數,下面的呼叫
two(a
=
1
,b
=
2
,c
=
3
,d
=
4
,e
=
5
,f
=
6
)
傳入到 one(a,*b)中,等價於:
two(a
=
1
,)
單星號(*)的其它作用:
單星號變數不僅僅能夠用在函式的引數傳遞中,實際上對乙個普通變數使用單星號字首,能夠將這個變數拆分成單個元素。
#如果在變數前面使用單星號,實際上是對變數的一次拆解操作,將變數中單獨的元素拆解出來,然後依次傳入one()函式
而傳入one()函式後,one()函式會將這些傳入的單個元素儲存成乙個元組,這就是為什麼我們 print(x[0])能夠提取第乙個元素的原因
變數在傳入到單星號變數函式中時,會將變數自動轉化為元組,而元組是不能改變的。
另外,單星號是無法讀取到字典中的值的,永遠只會讀取到字典中的鍵(key),如果想讀取到字典中的值,需要使用雙星號(**)
雙星號可以用來獲得字典的值
需要注意的是:
使用這種方法將字典傳入函式的時候,字典的鍵的命名要符合python變數的命名規則,通過上面的分析也不難看出,雙星號會將字典首先轉換成關鍵字引數的形式,就相當於使用字典中的鍵作為變數名,如果鍵不符合變數命名規則,則會拋個"typeerror"異常。
類變數和例項變數的區別
類變數也叫靜態變數,也就是在變數前加了static 的變數 例項變數也叫物件變數,即沒加static 的變數 區別在於 static被修飾的變數和方法,為該整個類及其類的物件所共享,乙個類或物件修改了被定義的類或方法,其他的也會跟著變數。這就是說被static修飾的是大家共用的。而沒有修飾的屬性就相...
成員變數和類變數的區別
由static修飾的變數成為靜態變數,其實質上就是乙個全域性變數。如果某個內容是被所有物件所共享,那麼該內容就應該用靜態修飾 沒有被靜態修飾的內容,其實是屬於物件的特殊描述。不同的物件的是例項變數將被分配不同的記憶體空間,如果類的成員變數有類變數,那麼所有都物件的這個類變數都分配給相同的一處記憶體 ...
成員變數和類變數的區別
由static修飾的變數稱為靜態變數,其實質上就是乙個全域性變數。如果某個內容是被所有物件所共享,那麼該內容就應該用靜態修飾 沒有被靜態修飾的內容,其實是屬於物件的特殊描述。不同的物件的例項變數將被分配不同的記憶體空間,如果類中的成員變數有類變數,那麼所有物件的這個類變數都分配給相同的一處記憶體,改...