【问题标题】:Forcing a type to be a tuple强制类型为元组
【发布时间】:2014-10-24 19:05:56
【问题描述】:

我是 Python 新手,我花了一些时间才意识到,在自动生成的代码中,这种语法意味着整数,而不是元组:

(1)

相比之下,[1] 仍然是一个数组。看起来语法不一致:-(

但是,是否有可能强制 (1) 成为一个元组?

编辑:

对于那些给我分的人来说似乎很明显。我想知道,为什么我到现在才遇到它。

事实上,我为学习 Python 而买的书 - “Learning Python, O'Reilly, Mark Lutz, 5th Ed.” 在第 121 页告诉我>,章节元组:

从句法上讲,它们通常用括号而不是 方括号...

下面的第一个例子定义了一个这样的元组:

>>> T = (1, 2, 3, 4)    # A 4-item tuple

真尴尬,这本书在亚马逊上获得了这么多明星。我目前在 1500 的第 160 页。我应该停止阅读吗?

【问题讨论】:

  • @wim:作为初学者,我在那个问题和答案中一个字都不懂。然而,似乎单独的逗号并不总是足够的,并且与其他语法冲突

标签: python syntax


【解决方案1】:

需要加逗号:

>>> (1,)
(1,)
>>> type((1,))
<type 'tuple'>
>>>

(1) 只是括号中的整数1:

>>> (1)
1
>>>

这是因为创建元组的是逗号,而不是括号(如果有的话):

>>> 1,
(1,)
>>> 1, 2, 3
(1, 2, 3)
>>> a = 1, 2, 3
>>> b = (1, 2, 3)
>>> a == b
True
>>>

但是请注意,您确实需要括号来创建一个空元组:

>>> ()
()
>>> type(())
<type 'tuple'>
>>>

尽管可以说在这种情况下创建元组的是逗号的缺席。 ;)


逗号确实创建了一个元组,但我应该更清楚。

你是对的,在[1,2,3] 中,逗号不会被解释为元组,因为每一端的方括号表示一个列表文字。

Python 中的逗号有四种用途:

  1. 创建一个元组文字,正如我上面演示的那样。

  2. 分隔列表/字典/集合文字中的项目:

    [1, 2, 3]       # List
    
    {'a':1, 'b':2}  # Dict
    
    {1, 2, 3}       # Set
    
  3. 在函数调用中分离参数:

    func(a, b)
    
  4. 在各种语句中分隔名称:

    import a, b
    
    global a, b
    
    nonlocal a, b
    
    with a as b, c as d:
    
    try:
        ...
    except (a, b):
    

    和可迭代解包:

    a, b, c = [1, 2, 3]
    

仅在第一种情况下,逗号被解释为创建一个元组。其他三种用法只是重复使用 , 字符来表示不同的含义。

【讨论】:

  • 创建元组的是逗号,而不是括号 - 当我再次想到这个陈述时,它不可能完全正确。这意味着[1,2,3] 是一个由一个元组1,2,3 组成的数组。然而,额外的逗号对我有帮助。
  • @ValentinHeinitz - 我在编辑中解释得更好。另外,你看的书也不错。我认为它只是使用了括号,因为它们很常见,尽管没有必要。 T = 1, 2, 3, 4 会产生相同的结果。像你这样的书的目的是教你 Python。我不认为它与这样复杂的语法规则有关。
【解决方案2】:

这不是语法上的不一致:构成元组的是逗号,而不是括号,而 litteral 元组的最小语法是:

my_tuple = 1,

只有空元组才需要括号。

【讨论】:

  • @iCodez:是的,它可以;)
  • 构成元组的是逗号,而不是括号 - 正如 iCodez 回答的评论中已经提到的那样:[1,2,3] 意味着数组有一个元组 (1,2,3) .因此,仅逗号似乎是不够的。
  • @ValentinHeinitz:然后?您还可以声明 'somefunc(1, 2, 3)` 不会使括号内的内容成为元组。 Python 的语法和语法都有文档记录,一些语法规则具有更高的优先级(函数调用、列表文字等)。
  • 我还在学习 Python 的概念,但是将函数定义为“参数包装在元组中的执行块”可能是相当正确的。我怀疑my_tuple = 1, 是一种在某些情况下有效的捷径,因为Python 自己添加了括号。更健壮的语法似乎是my_tuple = (1,)
  • @ValentinHeinitz 不要浪费时间“假设”。 Python的语法有一个正式的定义,你只需阅读它。
【解决方案3】:
In [208]: a = (1)

In [209]: type(a)
Out[209]: int

In [210]: a = (1,)

In [211]: type(a)
Out[211]: tuple

In [212]: a = (1,2)

In [213]: type(a)
Out[213]: tuple

In [214]: a = [1]

In [215]: type(a)
Out[215]: list

In [216]: a = [1,]

In [217]: type(a)
Out[217]: list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2014-12-30
    • 2021-12-27
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多