理解python变量赋值

understanding python variable assignment

本问题已经有最佳答案,请猛点这里访问。

我正在自学Python(以及一般的编程),对变量赋值有点困惑。我明白如果我有

1
2
>>> a = [1,2,3]
>>> b = a

ba在内存中指的是同一个对象。因此,如果我想创建一个新的列表,b,与a当前的值相同,我将如何实现这一点?

另外,考虑这个例子:

1
2
3
4
5
6
>>> a = [1, 2, 3]
>>> b = a
>>> x = a[1]
>>> a[1] = 4
>>> print a, b, x
[1, 4, 3] [1, 4, 3] 2

我从这个例子中看到,x是一个新对象,但b指向a。有人能给我解释一下这里发生了什么,为什么x是一个新的对象,而b不是?


这里的区别是,a是一个list,它是可变的(即可以就地更改),而a[1]是一个int,它是不可变的(即不能就地更改)。a[1] = 4list中的4代替2,但x仍指向2。@乔恩夏普

1
b = a[:]

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


考虑这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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被要求引用的"具体"的东西是一个完整的列表,它可以改变内容。

另一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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仍然指向旧对象。

我希望我能解释清楚。如果不评论。

编辑:正是@jonsharpe所说的。


我也是Python的新手。根据我目前所了解的,python中的所有内容都是一个对象,变量只是对这些对象的引用。

所以b=a意味着b指向与a相同的物体。

但是有两种类型的对象是可变的和不可变的。list是一个可变的对象,这意味着代码中a和b引用的实际列表可以修改。因此,您可以看到,当您对a进行更改时,实际上也在更改基础列表b。

要创建一个全新的列表b,可以使用b=a[:]