2016-12-15 46 views
2

考慮多重賦值x[0],y = y,x[0]。應用於以下四種情況中的每一種情況下,這給出了四種不同的結果。Numpy數組和列表的多重賦值,一個好奇的例子

  • 情況1:

    x = [[1,2], [3,4]] 
    y = [5,6] 
    

    給出

    x = [[5,6], [3,4]] 
    y = [1,2] 
    
  • 情況2:

    x = np.array([[1,2], [3,4]]) 
    y = [5,6] 
    

    給出

    x = array([[5,6], [3,4]]) 
    y = array([5,6]) 
    
  • 情況3:

    x = [[1,2], [3,4]] 
    y = np.array([5,6]) 
    

    給出

    x = [array([5,6]), [3,4]] 
    y = [1,2] 
    
  • 情況4:

    x = np.array([[1,2], [3,4]]) 
    y = np.array([5,6]) 
    

    給出

    x = array([[5,6], [3,4]]) 
    y = array([5,6]) 
    

似乎列表的多重賦值比Numpy數組的多重賦值更智能(自動執行臨時變量)。

想法?

編輯:它畢竟不是聰明......

+0

「看來,列出的多任務是聰明(通過一個臨時變量會自動),比numpy的陣列的多重任務。」 - 怎麼會這樣?當分配到Numpy數組時,它會將其轉換爲Numpy數組的一部分。 – Scimonster

回答

5

這裏唯一令人驚訝的情況下應該是2 & 4:

x = np.array([[1,2], [3,4]]) 
y = np.array([5,6]) # or [5, 6] 

x = array([[5,6], [3,4]]) 
y = array([5,6]) # where did the 1 and 2 go? 

因爲其他人都只是圍繞數據類型的交換,但保持相同的值。

使用numpy時有什麼不同,x[0]返回一個視圖,而不是副本。因此,即使在數組中的分配寫出臨時明確失敗:

temp = x[0] 
x[0] = y 
y = temp 

因爲temp一種觀點認爲是永遠不變的x[0],而不是在那個時間點的x[0]值的副本。

爲了使這一工作,爲numpy的情況下,你應該使用x[0],y = y,x[0].copy()

+0

嗯,是的,2和4是有趣的,但爲了完整性,我添加了所有這些。 – Gioker

1
x[0],y = y,x[0] 

等於

t = x[0] 
x[0] = y 
y = t 

由於@Scimonster指出,

當分配到一個numpy的陣列,它將其轉化爲 Numpy陣列的一部分。

所以這是正常的行爲。

+0

這兩個代碼塊是相同的並不是真的。不創建臨時變量't';內部'y'和'x [0]'被壓入堆棧,翻轉,然後彈出回來分配。這兩種方法可能導致不同的結果。 –

+0

@ajcr:除了名字't'被破壞之外,你能否構造一個結果不同的情況? – Eric

+0

@Eric:我想我錯了,記得像[這個問題](http://stackoverflow.com/questions/31566500/python-setting-two-variable-values-separated-by-a-comma-in- python/31566736#31566736),我剛纔遇到(我現在看到不涉及臨時變量)。我認爲應該可以構建奇怪的例子,在賦值過程中對變量進行變異(因此保留一個臨時變量不變),但是直到我能夠想出一些令人信服的東西,我會撤回以前的評論。 –