理解python变量赋值[重复]
Posted
技术标签:
【中文标题】理解python变量赋值[重复]【英文标题】:understanding python variable assignment [duplicate] 【发布时间】:2014-05-06 20:37:12 【问题描述】:我正在尝试自学 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
不是?
【问题讨论】:
我不认为它是重复的。 这回答了关于如何创建新列表的第一个问题。谢谢!第二个问题让我很困惑。 如果这不是重复的,它可能太宽泛了。这里具体发生的事情更多地与列表和整数的处理以及 Python 在内部表示它们的方式有关,而不是与它如何解决分配有关。如果我们必须检查非常数据类型,它确实会变得冗长。 不,这与整数无关。 这里的区别是a
是一个list
,是可变的(即可以原地改变),而a[1]
是一个int
,是不可变的(即可以'不要原地改变)。 a[1] = 4
替换 2
列表中的4
,但x
仍指向2
。
【参考方案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】:第二个问题的答案是,当你
x = a[1]
x
指向的是a[1]
中的对象,而不是a[1]
。
当您更改a[1]
时,您更改的是a[1]
指向的对象,而不是对象本身。
但是,x
仍然指向旧对象。
我希望我解释清楚了。如果不评论。
编辑:正是@jonrsharpe 所说的。
【讨论】:
【参考方案3】:这里的区别在于a
是一个list
,它是可变的(即可以原地改变),而a[1]
是一个int
,它是不可变的(即不能在原地改变)地方)。 a[1] = 4
在list
中将2
替换为4
,但x
仍指向2
。 -@jonrsharpe
b = a[:]
将创建a
的克隆,它是一个不同的对象。我们这样做是因为list
s 是可变的,所以当我们在技术上像我们在这里一样从另一个列表中提取一部分时,它可以引用一个新对象。
【讨论】:
【参考方案4】:我也是 python 新手。根据我目前的理解,python 中的一切都是一个对象,变量只是对这些对象的引用。
所以 b = a 意味着 b 与 a 指向同一个对象。
但是,有两种类型的对象是可变的和不可变的。 List 是一个可变对象,这意味着可以修改代码中 a 和 b 引用的实际列表。因此,您会看到,当您对 a 进行更改时,您实际上是在更改底层列表,这也在更改 b。
要创建一个全新的列表 b,您可以使用 b=a[:]
【讨论】:
以上是关于理解python变量赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章