我正在尝试自学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
不是?
答案 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)
这里的区别在于a
是list
,它是可变的(即可以就地更改),但a[1]
是int
,这是不可变的(即不能改变到位)。 a[1] = 4
将2
替换为4
中的list
,但x
仍然指向2
。 - @ jonrsharpe
b = a[:]
将创建一个a
的克隆,它是一个不同的对象。我们这样做是因为list
是可变的,所以当我们在技术上采用我们在这里的另一个列表的一部分时,它可以引用一个新对象。
答案 3 :(得分:0)
我也是python的新手。根据我的理解到目前为止,python中的所有内容都是一个对象,而变量仅仅是对这些对象的引用。
所以b = a表示b指向与...相同的对象。
但是有两种类型的对象是可变的和不可变的。 List是一个可变对象,意味着可以修改代码中a和b引用的实际列表。因此,您会看到当您对a进行更改时,您正在有效地更改基础列表,这也会改变b。
要创建全新的列表b,您可以使用b = a [:]