理解python变量赋值

理解python变量赋值,python,Python,我试图自学python(以及一般的编程),但对变量赋值有点困惑。我明白如果我有 >>> a = [1,2,3] >>> b = a b指的是内存中与a相同的对象。因此,如果我想创建一个新列表,b,其值与a当前的值相同,我将如何实现这一点 也可以考虑这个例子: >>> a = [1, 2, 3] >>> b = a >>> x = a[1] >>> a[1] = 4 >>>

我试图自学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
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]

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

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

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

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

编辑:正是@jornsharpe所说的。

考虑一下这个例子:

>>> a = [1, 2, 3]
>>> b = a
>>> x = a[1]
>>> a[1] = 4
>>> print a, b, x
[1, 4, 3] [1, 4, 3] 2
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]
更改时,它确实更改了。但它所指的东西并没有停止存在(因为
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]

这里的区别在于
a
是一个
列表,它是可变的(即可以在适当的位置更改),但是
a[1]
是一个
int
,它是不可变的(即不能在适当的位置更改)
a[1]=4
2
替换为
列表中的
4
,但
x
仍指向
2
-@琼尔夏普

b = a[:]

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

我也是python新手。根据我到目前为止的理解,python中的一切都是一个对象,变量只是对这些对象的引用

所以b=a意味着b指向与a相同的对象

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


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

我认为它不是重复的。这回答了关于如何创建新列表的第一个问题。谢谢第二个问题让我很困惑。如果这不是一个重复的问题,它可能太宽泛了。这里具体讨论的是列表和整数的处理以及Python内部表示它们的方式,而不是它如何解析赋值。如果我们必须检查每个数据类型,它可能会变得冗长。不,它不是关于整数的。这里的区别是
a
是一个
列表
,它是可变的(即可以就地更改),但是
a[1]
是一个
int
,它是不可变的(即不能就地更改)
a[1]=4
将列表中的
2
替换为
4
,但
x
仍指向
2