理解python变量赋值
这个问题在这里已经有了答案:
考虑这个例子:
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
代替2
与4
中的list
,但x
仍然指向2
。 - @ jonrsharpe
b = a[:]
将创建的克隆a
是不同的对象。 我们这样做是因为list
s是可变的,所以当我们在技术上采用另一个列表的一部分时,就像我们在这里一样,它可以引用一个新的对象。