標籤:assign enc extend 拷貝 直接 建立 star red 賦值
Python中複製文法有6種
Basic Form
>>>spam = ‘spam‘
Tuple assignment
>>>spam, ham = ‘spam‘, ‘ham‘
List assignmen
>>>[spam, ham] = [‘spam‘, ‘ham‘]
Sequence assignment
>>>a, b,c,d = ‘spam‘
Extended sequence unpacking(Python 3.X)
>>>a, *b = ‘spam‘>>>a‘s‘>>>b # b賦值的結果是一個list[‘p‘, ‘a‘, ‘m‘]>>>a, *b, c = ‘spam‘>>>a‘s‘>>>b[‘p‘, ‘a‘]>>>c‘m‘
對於這種複製方式,需要注意五點:
1 對於有*號變數的賦值結果,總是一個list,即使只包含一個元素
2 如果沒有剩餘的值賦給有*號的變數,那就是一個空list
>>>>a, b, c, *e, d = ‘spam‘>>>a‘s‘>>>b‘p‘>>>c‘a‘>>>d‘m‘>>>e # 與*變數的位置無關[]
3 如果一條指派陳述式中出現2個或者2個以上的*變數,會報錯
4 變數個數和值的個數不匹配,也會報錯
>>>a, b, c, d,e = ‘spam‘ # 值個數太少ValueError: not enough values to unpack (expected 5, got 4)>>>a, b = ‘spam‘ # 變數個數太少ValueError: too many values to unpack(expected 2)
5 帶*號變數不在一個sequence中,也會報錯
>>>*a = ‘spam‘SyntaxError: starred assignment target must be in a list or tuple>>>*a, = ‘spam‘ # 這樣OK>>>a[‘s‘, ‘p‘, ‘a‘, ‘m‘]
Augmented assignment
>>>spams = 42>>>spams += 42>>>spams84
Augmented assignment有3個優勢:
1 簡潔,可以少打字,哈哈
2 對於X += Y的形式,如果X是一個很複雜的對象,那麼Augmented assignment對X只運行一次代碼,而如果寫成X = X + Y的形式,對於X的代碼會運行兩次
3 在某些情形下,X+=Y是一種最佳化
>>>L = [1, 2]>>>L = L + [3, 4] # 這種形式的+會建立一個臨時的,新的list,然後將L和要串連的數組copy進去,最後再把這個臨時的,新的list賦值給L,效率低>>>L[1, 2, 3, 4]>>>L = [1, 2]>>>L += [3, 4] # 這種形式直接改變L,不建立新對象,也不拷貝,效率高>>>L[1, 2, 3, 4]
Python中的賦值文法