理解python变量赋值

时间:2014-03-27 17:28:39

标签: python

我正在尝试自学python(和一般的编程)并且对变量赋值有点困惑。我明白,如果我有

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

b引用内存中与a相同的对象。因此,如果我想创建一个新列表b,其值与a目前相同,我将如何实现?

另外,请考虑以下示例:

>>> 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不是?

4 个答案:

答案 0 :(得分:1)

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

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

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

编辑:正是@jonrsharpe所说的。

答案 1 :(得分:1)

考虑这个例子:

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]

答案 2 :(得分:1)

这里的区别在于alist,它是可变的(即可以就地更改),但a[1]int,这是不可变的(即不能改变到位)。 a[1] = 42替换为4中的list,但x仍然指向2。 - @ jonrsharpe

b = a[:]

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

答案 3 :(得分:0)

我也是python的新手。根据我的理解到目前为止,python中的所有内容都是一个对象,而变量仅仅是对这些对象的引用。

所以b = a表示b指向与...相同的对象。

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

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