2016-12-15 65 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),我刚才遇到(我现在看到不涉及临时变量)。我认为应该可以构建奇怪的例子,在赋值过程中对变量进行变异(因此保留一个临时变量不变),但是直到我能够想出一些令人信服的东西,我会撤回以前的评论。 –