为什么集合的扩充分配行为不同?

时间:2019-03-28 11:58:56

标签: python

我以两种方式对集合使用普通联合,即x|=set([4,5,6])x=x|set([4,5,6]),为什么它们的行为有所不同?

对于简单的整数变量,其工作方式相同,即无论我使用的是x=x+1还是x+=1,结果都是相同的。

x=set([1,2,3])
y=x
x|=set([4,5,6])
x
set([1, 2, 3, 4, 5, 6])
y
set([1, 2, 3, 4, 5, 6])



x=set([1,2,3])
y=x
x=x|set([4,5,6])
x
set([1, 2, 3, 4, 5, 6])
y
set([1, 2, 3])  # why does the value of y remain unchanged.

1 个答案:

答案 0 :(得分:4)

您正在创建一个新的set并在此处将其分配给x

x = x | set([4, 5, 6])

从这里y开始独立于x(它们是不同set的名称)。

另一方面,在第一个示例中,

就地分配不会创建新集合;它只是修改

中的当前实例
x |= set([4, 5, 6])

现在y仍与set引用相同的x。您可以通过打印看到差异

 print(id(x))
 print(id(y))

作业前后。

可视化pythontutor.com上的差异是有益的。


我上面说的

一切对于可变对象(例如set)都是有效的。对于不可变对象,就地分配的行为与“常规”分配相同;即对于xintx += 1x = x + 1相同。