賦值
序列賦值:
a,b,c,d='spam'
序列賦值有點類似元組解包,兩邊可以看做兩個元組然後分開賦值。再給幾個例子:
a,b=[3,4]
print(a,b)
>>>3 4
這是比較一般的情況,兩邊都是迭代對象,像list,range(),str,tuple都是可以的,不過要保證結構相同
((a,b),c,d)=[[2,3],4,5]
print(a,b,c,d)
>>>2 3 4 5
使用單個*
會將未匹配內容分給一個變量:
需要注意,*b匹配到的是一個列表,如果沒有未匹配內容,則是空列表[]
a,b='spam'
>>>ValueError: too many values to unpack (expected 2)
可以看到,左邊是兩個變量,右邊可迭代對象有四個元素,報錯
a,*b='spam'
a,b>>>s ['p', 'a', 'm']
L=[1,2]
a,b,*c=L[:]
print(a,b,c)>>>1 2 []
再次值得注意的是,賦值是將對象地址指向變量名的過程,所以增量賦值會共享引用
比如
多目標賦值:
a=b=c=xxx
如果是個數字等不可變對象,我們大可不必擔心,因爲每次修改其實會更改指向
如果是列表這樣的可變對象,問題就值得注意了:
a=b=c=[]
a.append(1)
print(a,b,c)
>>>[1] [1] [1]
此時如果改變一個列表其他不變,則考慮使用copy
方法,或者a=b[:]來創建新對象
相同的道理,對列表的增量賦值可以實現拼接相同的效果,不過實現的是在原位置上修改,跟.extend()
方法是相同的,而L+[1,2,3]
這種拼接則是生成新對象;
輸出
一般的,Python3 直接使用 print()
來輸出內容,這等價於
import sys
sys.stdout.write('str')
看過print源碼我們就會發現,其實就是調用流stdout實現的,並且將各種類型轉換爲字符串。
通過重新定向stdout可以定向輸出:
import sys
sys.stdout=open('text.txt','a')
print('添加一條消息')
這個例子執行print會打開text.txt文件並向後追加字符串。其實作用跟print的file參數
相同
明白這一點後,我們就可以通過print實現對GUI輸出,或者寫入文件等諸多功能。