Python,这是一个bug,附加到元组中的列表会导致无吗?

时间:2012-03-08 12:48:50

标签: python list append tuples iterable-unpacking

这是我很长一段时间写的最短的例子之一

我创建并更新了一个tuple3

In [65]: arf=(0,1,[1,2,3])

In [66]: arf=(arf[0],arf[1], arf[2] )

In [67]: arf
Out[67]: (0, 1, [1, 2, 3])

所以重新分配工作。

现在我尝试改变它的内容。

In [69]: arf=(arf[0],arf[1], [2] )

In [70]: arf
Out[70]: (0, 1, [2])

In [71]: arf=(arf[0],arf[1], arf[2].append(3) )

In [72]: arf
Out[72]: (0, 1, None)

我回来无???嘿,是什么给出的?对不起,我是一个蟒蛇菜鸟。

4 个答案:

答案 0 :(得分:5)

list.append()始终返回None

因此arf[2].append(3)会将3追加到arf并返回None

您永远不会看到arf[2]的此更改,因为您立即将arf重新绑定到新创建的元组

也许这就是你想要的

arf = (arf[0], arf[1], arf[2]+[3])

答案 1 :(得分:3)

list.append方法会更改列表并返回None。这不是错误,这只是append方法的工作方式。

答案 2 :(得分:1)

append没有[返回新列表,它就地修改了旧列表:

>>> a = [1, 2, 3]
>>> b = a.append(4)
>>> print b
None
>>> print a
[1, 2, 3, 4]

答案 3 :(得分:0)

为了详细说明gnibbler的答案,list.append()会更改列表本身,但它不会返回列表的新值。它返回None。因此,您的命令71以您希望的方式更改arf [2]的值,但随后它立即返回None并将arf [2]设置为该值。

示例中的自引用会使事情变得模糊,但如果您尝试someothervariable=arf[2].append(3)之类的命令,您将看到它是如何工作的。 someothervariable设置为None,arf [2]附加3而没有明确的赋值语句。