共同分配python变量与整数和集合的工作方式不同。为什么?

时间:2018-04-27 06:46:51

标签: python

假设我将两个python变量共同分配为零:

>>> x = y = 0

当我现在分配给一个值时,它会独立于另一个值而变化:

>>> y = 2
>>> x
0
>>> y
2

现在假设我将两个python变量共同分配给一个空集:

>>> a = b = set([])

当我现在添加到一个集合时,它会更改另一个集合的值。为什么?

>>> b.add(2)
>>> a
set([2])
>>> b
set([2])

1 个答案:

答案 0 :(得分:1)

由于对OP答案的回应只是隐含的线索,我将它们变为明确:

y = 0
x = y

名称xy引用具有0值的相同int对象。

int个对象是不可变的。你无法改变它们,但它实际上并没有改变它们 重要的是你指的是零值的对象,如果有几个。

再次使用

分配y
y = 2

y现在引用值为2的不同int对象。 x仍然引用旧的0值对象。

如果考虑像集合这样的可变类型,

b = set()
a = b

ab引用相同的空集对象。 如果使用就地分配更改设置对象,或使用在原位更改它的对象方法,则对象保持不变(但其值内容已更改)。 因此,您可以通过ab来查看更改的对象。

但是,要比较苹果和苹果,并按照int样本进行

b = set() # a new empty set

b成为一个新的不同的空集对象,而a仍然引用原始对象。

>>> a = set()
>>> b = a
>>> id(a) == id(b)
True
>>> b = set()
>>> id(a) == id(b)
False
>>>

因此,在这两种情况下,行为实际上是相同的。但在国际情况下,您无法对对象值进行更改。