在python中更改表达式时为什么mutable不工作?

时间:2014-03-11 12:31:22

标签: python

这里我正在使用python中的list来学习可变概念,

In [114]: x=[1,2]

In [115]: y =x

In [116]: id(y)==id(x)
Out[116]: True

从上面x和y共享相同的状态。我在下面发现了两个案例,

1)这里可变的概念起作用,因为它共享相同的状态,

In [123]: y +=[1,3]

In [124]: id(y)==id(x)
Out[124]: True

In [125]: y
Out[125]: [1, 2, 1, 3]

In [126]: x
Out[126]: [1, 2, 1, 3]

2)这里可变概念不起作用,因为它没有共享相同的状态,

In [130]: y =y+[1,3]

In [131]: id(y)==id(x)
Out[131]: False

In [132]: x
Out[132]: [1, 2]

In [133]: y
Out[133]: [1, 2, 1, 3]

为什么可变概念不适用于第二种情况?

y += [1,3]y =y+[1,3]不相等?

2 个答案:

答案 0 :(得分:1)

y += [1,3]   # Means append to y list [1,3], object stays same
y = y+[1,3]  # Means create new list equals y + [1,3] and write link to it in y

答案 1 :(得分:0)

不,他们不是。 op=(其中op可以是+,*, - ,/,...)是“就地”运营商。

所以如果可以,他们修改作业的左侧。

另一方面,

X op Y创建一个新实例并将结果放在那里。

这意味着

 y = [1,2]
 y += [3,4]

相同
 y = [1,2]
 y.extend([3,4])

,而

 y = [1,2]
 y = y + [3,4]

相同
 y = [1,2]
 tmp = list(y) # Create copy of y
 tmp.extend([3,4])
 y = tmp