理解python变量赋值

这个问题在这里已经有了答案:

  • 如何克隆或复制列表? 17个答案
  • 变量赋值和修改(在Python中)6个答案

  • 考虑这个例子:

    In [20]: a = [[1], [2], [3]]
    
    In [21]: b = a
    
    In [22]: x = a[1]
    
    In [23]: a
    Out[23]: [[1], [2], [3]]
    
    In [24]: b
    Out[24]: [[1], [2], [3]]
    
    In [25]: x
    Out[25]: [2]
    
    In [26]: a[1][0] = 4
    
    In [27]: a
    Out[27]: [[1], [4], [3]]
    
    In [28]: b
    Out[28]: [[1], [4], [3]]
    
    In [29]: x
    Out[29]: [4]
    

    这里的区别在于,当我们用a[1]修饰时,我们通过修改它而不是告诉a[1]来引用全新的东西。

    在你的情况下,当你告诉x指向a[1]所指的任何东西时,它会找到一个具体的东西的引用,无论在当时a[1]中是什么,在你的情况下是一个特定的整数。

    稍后当你告诉a[1]改变时,它确实改变了。 但它用来指代的东西并没有停止存在(因为x仍然指向它)。

    通过说x = a[1]你并不是说x总是指a[1]所指的任何东西。

    你所说的x应该指任何a[1]在此时的任务。

    这同样适用于b也,它只是对“具体”的事情是b被告知指是整个列表-它可以有变化的内容。

    另一个例子:

    a = [1, 2, 3,]
    b = a
    
    print a, b
    
    # Prints
    #[1, 2, 3]
    #[1, 2, 3]
    
    a = [4, 5, 6]
    
    print a, b
    
    # Prints
    #[4, 5, 6]
    #[1, 2, 3]
    

    第二个问题的答案是当你x = a[1] x指向a[1]而不是a[1]

    当您更改a[1]您将更改a[1]指向的对象,而不是对象本身。 但是, x仍然指向旧对象。

    我希望我解释清楚。 如果没有评论。

    编辑:正是@jonrsharpe说的。


    这里的区别是, a是一个可变的list ,即可以改变的地方,但是a[1]是一个int ,它是不可变的(即不能被改变)。 a[1] = 4代替24中的list ,但x仍然指向2 。 - @ jonrsharpe

    b = a[:]
    

    将创建的克隆a是不同的对象。 我们这样做是因为list s是可变的,所以当我们在技术上采用另一个列表的一部分时,就像我们在这里一样,它可以引用一个新的对象。

    链接地址: http://www.djcxy.com/p/19675.html

    上一篇: understanding python variable assignment

    下一篇: ValueError when using matplotlib tight