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中的值
答案 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]
检查这些可视化:
答案 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)
这与您分配的对象是mutable
或immutable
有关。
简单地说-可变对象创建后可以更改,不可变对象不能更改。
考虑到您有一个分配给对象的变量a
,当您将新变量指向a
变量时,有两种可能性:
mutable
->您将使用新变量指向同一对象immutable
->,则将新对象分配给新变量。您的第一种情况:
a
,它是一个可变对象b
指向同一列表对象。 第二种情况:
c
分配给不可变的int=4
对象。d
。int=8
对象分配给变量c
。 有很多文章说明对象是可变的,例如:https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747