为什么一个值改变而第二个值没有改变?

时间:2019-12-30 14:14:48

标签: python

a = [ 1, 2 ]
b = a
a.append(3)
print(b) # shows [ 1 2 3 ] which means b changed

c = 4
d = c
c = 8
print(d) # shows 4 which means d did not change

为什么b改变了,而d没有改变? .append更改了存储在b中的值,但是c = 8并没有更改d中的值

3 个答案:

答案 0 :(得分:6)

这两个例子并不相同。

通过执行b = a,您告诉b指向a指向的相同列表。如果通过a更改了列表,即使通过b进行了自省,列表也会被更改。内存中只有一个列表。

在第二个示例中,您正在执行d = c,它告诉d指向与c相同的整数,但是随后您告诉c指向另一个整数整数。 d对此一无所知,它仍指向c所指向的整数。

第二个示例使用列表的等效示例将是

a = [1, 2]
b = a
a = []
print(a)
# []
print(b)
# [1, 2]

检查这些可视化:

Your first example

Your second example

My example

答案 1 :(得分:1)

@DeepSpace提供的答案是一个很好的解释。

如果要检查两个变量是否指向相同的内存位置,可以使用is运算符,并使用id进行打印。

>>> a=[1,2]
>>> b=a
>>> a is b
True
>>> id(a),id(b)
(2865413182600, 2865413182600)
>>> a.append(2)
>>> a,b,id(a),id(b)
([1,2,2],[1,2,2],2865413182600, 2865413182600)
>>> a=[1,2]
>>> b=[1,2]
>>> a is b
False

答案 2 :(得分:0)

这与您分配的对象是mutableimmutable有关。

简单地说-可变对象创建后可以更改,不可变对象不能更改。

考虑到您有一个分配给对象的变量a,当您将新变量指向a变量时,有两种可能性:

  1. 如果对象是mutable->您将使用新变量指向同一对象
  2. 如果对象为immutable->,则将新对象分配给新变量。

您的第一种情况:

  • 首先,您创建一个列表a,它是一个可变对象
  • 然后使用第二个变量b指向同一列表对象。
  • 更改值时,只需更改两个变量都指向的可变对象即可。

第二种情况:

  • 首先,您将变量c分配给不可变的int=4对象。
  • 然后将其分配给第二个变量d
  • 接下来发生的是,您将新的不可变int=8对象分配给变量c

有很多文章说明对象是可变的,例如:https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747