Python:双括号有什么作用?

8
有人能告诉我为什么这里的括号是双倍的吗?
self.__items.append((module, item))
3个回答

15

内部括号创建一个元组

>>> type(('a', 'b'))
<type 'tuple'>

从技术上讲,可以不使用括号创建元组:

>>> 'a', 'b'
('a', 'b')

但有时它们需要括号:

>>> 'a', 'b' + 'c', 'd'
('a', 'bc', 'd')
>>> ('a', 'b') + ('c', 'd')
('a', 'b', 'c', 'd')
在您的情况下,需要使用括号来区分元组和逗号分隔的函数参数。例如:
>>> def takes_one_arg(x):
...     return x
... 
>>> takes_one_arg('a', 'b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: takes_one_arg() takes exactly 1 argument (2 given)
>>> takes_one_arg(('a', 'b'))
('a', 'b')

11

它将元组 (module, item) 作为单个参数传递给函数。如果没有额外的括号,它将把 moduleitem 分别作为参数传递。


1
到目前为止提供的所有答案都应该对OP有所帮助。我个人最喜欢这个答案,因为它不会在元组创建方面触发“学究”警报。干得好! - John Y
2
@JohnY 明显知道它创建元组的人不会提出这个问题。 - Hi-Angel
@Hi-Angel:我认为你没有理解我的评论。我所指的“追求严谨”的警报是关于“元组是由逗号而不是括号创建”的整个事情。元组追求者喜欢引起这一点的注意,并似乎在每一个机会都这样做。当然,这是一个真实的观点;但对我来说,它过于技术化,特别是对于初学者的解释。我喜欢这个答案的原因是它的措辞方式并没有强调这一点。 - John Y
1
@JohnY 哦,好吧,实际上当我第一次阅读这个答案时,我错过了tuple这个词,所以我就像“嗯?为什么花括号会成为一个单一的参数?”不管怎样,我对Python有些缺乏经验,尽管如此,我还是喜欢下面关于逗号生成元组的技术解释。 - Hi-Angel

2

这与说:

parameter = (module, item)
self.__items.append(parameter)

即内部括号先创建一个元组,然后将该元组用作单个参数传递给append()

除非您的示例中需要元组周围的括号,否则不需要它们...参数=模块,项目就可以了。 - ch3ka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接