请问这样的用法要怎么理解

2016-08-24 17:59:58 +08:00
 lixia625
>>> a=()
>>> a
()
>>> a+=1,
>>> a
(1,)
>>> a=[]
>>> a+=1,
>>> a
[1]
2555 次点击
所在节点    Python
12 条回复
sinux
2016-08-24 18:06:28 +08:00
这样理解:“这么写根本就是错的”。
wlsnx
2016-08-24 18:09:25 +08:00
论括号的重要性

>>> a=()
>>> a
()
>>> a+=(1,)
>>> a
(1,)
>>> a=[]
>>> a+=[1,]
>>> a
[1]
lixia625
2016-08-24 18:09:46 +08:00
@sinux
然而没有报错
lixia625
2016-08-24 18:10:26 +08:00
@wlsnx
卡尔王 请问凭啥这么加括号
sinux
2016-08-24 18:12:09 +08:00
@lixia625 因为省略括号的逗号就会被解释器认为 tuple
lixia625
2016-08-24 18:12:48 +08:00
@sinux 那 list 怎么解释
wlsnx
2016-08-24 18:13:37 +08:00
@lixia625
本来就是要加括号的,被省略了而已
另一个例子是 return 1,2,3 => return (1,2,3)
我的建议是该加的括号要加,很关键
sinux
2016-08-24 18:14:46 +08:00
@lixia625 不懂了,等指教。
lixia625
2016-08-24 18:15:53 +08:00
@wlsnx 好吧 python 黑魔法
sinux
2016-08-24 18:33:16 +08:00
@wlsnx @lixia625

噢,搞清楚了,这和省不省略括号没关系
省略了括号的 1, 永远都会是 tuple
问题的根源在于 +=
list += 会被解释为 list.extend()
这个方法接受一切可迭代对象, tuple 自然也是,所以 list.extend((1,2)) 也是成功的咯

然后你莫名其妙的用一个 list 直接加上一个 tuple 还是会告诉你报错的。
TypeError: can only concatenate list (not "tuple") to list

参考:
http://stackoverflow.com/questions/13332987/list-tuple-vs-list-list-tuple
jugelizi
2016-08-24 18:44:36 +08:00
两个 tuple 连接也没啥问题啊
wizardforcel
2016-08-25 12:21:52 +08:00
tuple 的 += 调用 __add__,而 list 的 += 调用 __iadd__。

前面那个只接受 tuple ,后面那个接受 iterable 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/301528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX