2016-04-26 135 views
3

是否有人可以解釋一下在左側用逗號分隔的鏈(可能不是正確的術語,但我不想將其與list混淆)變量名的概念的賦值運算符?Python賦值運算符左側的多個變量

什麼,我指的是以下性質

reader = csv.reader(open('some_file', 'rb')) 
for row in reader: 
    k, v = row 
    myDictionary[k] = v 

我知道,例如可能導致「SOME_FILE」的格式問題,所以這裏的東西是另外一個例子,我來了跨

username, password = sys.argv[1:] 

我的理解是argv來自命令行,1:指python腳本名之後的所有參數,但怎麼做用戶名和密碼獲取正確的項目?換句話說,什麼劃定了傳遞給這個程序的參數,它只是參數之間的空間?

參照第一個示例,假設row是兩列線,kv如何從row獲得它們的值。那些使用逗號作爲分隔符?

對Python代碼或文檔的任何解釋和/或鏈接都會很棒。

+0

歡迎使用超級用戶!這個問題是關於編程的,因此在這裏是無關緊要的,但是應該非常適合堆棧溢出。請不要重複堆棧溢出問題,請將問題標記爲請管理員爲您移動它。 – heavyd

+2

相關的Python文檔[這裏](https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences) – heavyd

+0

我不好,你絕對正確。感謝您對此的意見! – curran

回答

2
k, v = row 

username, password = sys.argv[1:] 

sequence unpacking例子。序列解包要求賦值運算符左側的變量數與右側序列具有相同數量的元素。如果他們做的序列的第一個元素被分配給第一個變量,第二個到第二個等等。如果它們不相等,它會拋出一個值錯誤。

str,unicode,list,tuple,bytearray,buffer,xrange都是有效的序列,可以在操作符的右邊使用。


所有需要了解的是'row'和sys.argv [1:]是否是有2個元素的有效序列。

csv.reader()將csv的每一行作爲字符串的列表返回。所以這是一個有效的序列。如果csv有2列,列表將有2個元素。默認情況下,csv.reader使用逗號作爲分隔符。如果需要,可以指定一個不同的分隔符:

csv.reader(csv_file, delimiter='|') 

對於Python的每次調用,sys.argv自動爲代表的論據在命令行(由空格隔開)的字符串的列表。所以再次有效的序列。 argv [0]始終是腳本名稱。因此,如果用戶使用2個參數運行該程序,則根據需要,用戶名後跟密碼sys.argv [1:]將成爲2個元素的列表。

-1

左側有一個TUPLE變量,右側有一個值列表。每個變量都會得到相應的值。 所以這個方法與字符串和任何值分隔符無關。關鍵字是LIST(s)。

至於CSV文件,你可以在讀卡器(定義)得到 是pydoc CSV 的信息:

reader(...) 
    csv_reader = reader(iterable [, dialect='excel'] 
          [optional keyword args]) 
     for row in csv_reader: 
      process(row) 

    The "iterable" argument can be any object that returns a line 
    of input for each iteration, such as a file object or a list. The 
    optional "dialect" parameter is discussed below. The function 
    also accepts optional keyword arguments which override settings 
    provided by the dialect 

+1

這不是一個列表,而是一個沒有被圓括號包圍的元組定義。請參閱上面來自heavyd的鏈接。 –

+0

雖然你是對的,但我不認爲curran處於他/她可以/必須知道列表和元組之間(輕微)區別的位置。 –

+1

更具體地說,行是一個列表,如果它有2個值,那麼將這兩個值複製到一個元組的兩個值中,在這種情況下,這些變量是變量k和v。 –

1

這適用於同樣的原因,這個工程:

a, b = [1, 2] 

其中分配給a1b2

這適用於您的CSV閱讀器,因爲您的文件必須有兩列,第一個變量分配給該行的第一列,第二個變量分配給第二列。讀者返回類似上面的列表,以便爲什麼它的工作原理:)

0

基本上csv reader回報每行作爲一個list

現在假定一個清單a=[1,2,3] 如果你想通過分配,應該是

解壓名單
a1,a2,a3 = a 

和拆包值將分配這樣的可變

a1=1 a2=2 a3=3

the number left side assignment variable should be the equal of length of list.

如果變量和列表長度的數量是不相等的比你會得到一個錯誤

ValueError: too many values to unpack

和列表將解壓的價值,因爲它的指數,併爲其分配左至右變量。

現在讓我們來看看。 在csv reader的行是list type,而此列表的lengthcsv文件列的編號。所以,當你打開它時,你必須記住賦予賦值變量的數量。

而另一個sys.argv[]也返回一個列表。

而且最後csv文件分隔符爲comma(,)和命令參數解析器分隔符爲space(一個/多個),但分析後,他們都返回一個list。所以當我們試圖解包它多個賦值變量時,我們必須考慮列表。