【发布时间】:2011-07-11 16:56:06
【问题描述】:
>>> list1 = []
>>> list2 = list1
>>> list2 += [1]
>>> print list1
[1]
对比一下
>>> list1 = []
>>> list2 = list1
>>> list2 = list2 + [1]
>>> print list1
[]
'+='-操作修改原始列表是否有原因?
编辑:只是为了让我的问题更清楚
在我知道的大多数语言中,'+='-操作符不能这样工作,我想知道为什么它在 python 中是这样设计的。
一些例子:
红宝石
irb(main):001:0> l = []
irb(main):002:0> a = l
irb(main):003:0> a += [2]
irb(main):004:0> l
=> []
Scala 等。
【问题讨论】:
-
有趣。可能是因为在
list2 = list2 + [1]中,list2 + [1]创建了一个新列表,然后将其分配给list2。我想这是 pythonista 习惯的那些“怪癖”之一。不过,这对初学者来说是令人困惑的。 -
@MartijnPieters:我认为问题有点不同。我在这里问设计的原因(因为恕我直言,与同一运算符的工作方式相比有点奇怪,例如Scala 和 Ruby),另一个问题更多是关于“发生了什么?”。
-
查看original PEP (Python Enhancement Proposal 了解动机。 将这个特性添加到 Python 有两个主要原因:表达的简单性和对就地操作的支持。最终结果是在语法简单性和表达简单性之间进行权衡;像大多数新功能一样,增强分配不会添加以前不可能的任何内容。它只是让这些事情更容易做。
-
@MartijnPieters:PEP 讲述了昂贵的矩阵运算。无论如何,我不太确定关于编程的问题,因为我真的只是想知道为什么有人认为这样做是个好主意为列表就地执行此操作。
-
在列表中就地执行此操作是一个绝妙的主意。
标签: python