Python元组...不是一个元组?逗号有什么作用?

时间:2016-12-09 19:17:18

标签: python python-3.x tuples

我正在查看课程资料中的代码,并且必须编写一个函数,将值99添加到listtuple。最终代码如下所示:

def f(l):
    print(l)
    l += 99,
    print(l)

f([1,2,3])
f((1,2,3))

这用于显示不同的内容,但我在l += 99,行上有点挂了。这样做,是创建一个包含99和list的迭代,以及tuple支持简单的"添加"这样的对象创建一个新实例/添加一个新元素。

我真正得到的是使用语法element,确切创建的内容?如果我执行x = 99,之类的作业,则type(x)将为tuple,但如果我尝试运行x = tuple(99),则会失败,因为99不可迭代。那就是:

  • 使用语法element,
  • 创建的某种中间可迭代对象
  • 是否定义了一个特殊的函数,允许在没有迭代的情况下调用tuple并以某种方式,映射到那个?

编辑: 如果有人想知道为什么接受的答案就是那个:我对第二个问题的解释就是这样。我应该对我的问题更清楚,但+=实际上让我感到困惑,这个答案包含了相关信息。

3 个答案:

答案 0 :(得分:5)

如果=的左侧参数是一个简单名称,则绑定到该名称的参数当前的类型无关紧要。 tuple(99)失败,因为tuple的参数不可迭代;它与x是否已引用tuple的实例无关。

99,创建一个带有单个参数的元组;只需将括号与逗号的其他用法分开即可使用括号。例如,foo((99,100))使用单个元组参数调用foo,而foo(99,100)使用两个不同的foo参数调用int

答案 1 :(得分:3)

元组构造函数需要一个可迭代的(就像你在错误消息中所说的那样),所以为了做x = tuple(99),你需要将它包含在像列表一样的迭代中:

x = tuple([99])

x = tuple((99,))

答案 2 :(得分:3)

语法element,只是创建一个"中间" tuple,而不是其他类型的对象(尽管tuple当然是可迭代的)。

但是,有时您需要使用括号以避免歧义。出于这个原因,您经常会看到:

l += (99,)

...即使括号在语法上不是必需的。我也碰巧认为这更容易阅读。但是在你已经发现的其他情况下,括号在语法上是必要的:

list((99,))
tuple((99,))
set((99,))

您也可以执行这些操作,因为[]会生成list

list([99])
tuple([99])
set([99])

...但是你不能这样做,因为99,在这些情况下不是tuple对象:

list(99,)
tuple(99,)
set(99,)

要回答第二个问题,不,没有办法让tuple()函数接收不可迭代的函数。实际上,这是element,(element,)语法的目的 - 与[]的{​​{1}}和list和{{}非常相似1}}(因为dictsetlist函数都需要可迭代的参数):

dict

正如问题评论中所讨论的那样,您可以使用set对象增加(+ =)[99] #list (99,) #tuple - note the comma is required {99} #set ,这一点令人惊讶。请注意,您无法执行此操作:

list

这是不一致的,所以它是probably something that should not have been allowed。相反,您需要执行以下操作之一:

tuple

然而,修复它会给人们带来麻烦(更不用说为邪恶的计算机科学教授带来混乱利用的成熟机会),所以他们没有。