我正在查看课程资料中的代码,并且必须编写一个函数,将值99添加到list
或tuple
。最终代码如下所示:
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
并以某种方式,
映射到那个?编辑:
如果有人想知道为什么接受的答案就是那个:我对第二个问题的解释就是这样。我应该对我的问题更清楚,但+=
实际上让我感到困惑,这个答案包含了相关信息。
答案 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}}(因为dict
,set
和list
函数都需要可迭代的参数):
dict
正如问题评论中所讨论的那样,您可以使用set
对象增加(+ =)[99] #list
(99,) #tuple - note the comma is required
{99} #set
,这一点令人惊讶。请注意,您无法执行此操作:
list
这是不一致的,所以它是probably something that should not have been allowed。相反,您需要执行以下操作之一:
tuple
然而,修复它会给人们带来麻烦(更不用说为邪恶的计算机科学教授带来混乱利用的成熟机会),所以他们没有。