【问题标题】:Why would a Python list work with parenthesis or brackets, but only brackets if one element? [duplicate]为什么 Python 列表可以使用括号或括号,但如果一个元素只能使用括号? [复制]
【发布时间】:2019-11-21 13:55:12
【问题描述】:

在很多个月前忘记了我的一个入门课程后,我正在进入 Python ......我称之为代码

filedialog.askopenfilename(filetypes = (("TCX files","*.tcx"),("All files","*.*")))  # Works

它有效。我决定只想要 *.tcx 文件,所以我使用

filedialog.askopenfilename(filetypes = (("TCX files","*.tcx")))                      # Doesn't work

filedialog.askopenfilename(filetypes = ("TCX files","*.tcx"))                        # Doesn't work

没有骰子 - 我明白了

“错误的文件类型“*.tcx”,应该是“typeName {extension ?extensions ...?}”

然后我试试

filedialog.askopenfilename(filetypes = [("TCX files","*.tcx")])                      # Works

它有效。我对 Python 想要方括号中的列表没有意见,但是第一行是否有效? Python 对单元素列表的处理是否与 N>1 根本不同?或者可能只是 tkinter 的代码——模块(filedialog)可以处理多态输入?

【问题讨论】:

  • 一个单项元组(不是列表)写成 (6,) 因为 (6) 只是被解析器视为 6(一些带有或不带有附加括号的表达式)。对于括号,没有歧义。
  • 啊,谢谢@MichaelButscher - 这也可以解释为什么当我试图解决这个问题时,我在教程中看到(6,) 的元组。解析器的有趣选择。函数(方法?)文档说元组 - Python 是否非常宽容我向它发送列表的情​​况?
  • @rnelsonee 正如我在回答中提到的那样,元组和列表都是可迭代的对象,它们具有相同的接口并在访问它们时给出相同的结果(但仅用于读取数据而不是修改它们),所以该功能适用​​于它们两者
  • 除了空元组()(否则不是有效的括号表达式)之外,创建元组的是逗号。只有当逗号可能被误认为另一个句法结构时才需要括号。考虑x = 3, 5,它将x 绑定到一个包含3 和5 的元组。比较foo(3, 5)(调用带有2 个参数的函数)和foo((3, 5))(调用带有单个元组参数的函数)。
  • 我相信filetypes 参数接受 any 元组的可迭代作为值。 filedialog.askopenfilename(filetypes = ("TCX files","*.tcx")) 的问题在于可迭代(一个元组)不包含元组,而是字符串。

标签: python tkinter


【解决方案1】:

看起来filetypes 参数应该是一个元组序列。因此,当您使用 ("TCX files","*.tcx") 作为此参数的值时,它会被视为一个序列 - 哪些元素是 不是 元组。

【讨论】:

    【解决方案2】:

    具有单个元素的元组需要以逗号结尾,以便 Python 知道您使用的是元组而不是参数。因此,如果您将第二个更改为此它应该可以工作:

    filedialog.askopenfilename(filetypes = (("TCX files","*.tcx"),))
    

    【讨论】:

      【解决方案3】:

      在第一种情况下,您得到:filetypes = (("TCX files","*.tcx"),("All files","*.*")),它是一个元组的元组。

      在第二个你得到filetypes = ("TCX files","*.tcx") 这是一个元组

      你得到的第三个 filetypes = [("TCX files","*.tcx")] 是一个元组列表(在这种情况下只有一个)

      第一个和第三个有效的原因是它们都是包含元组的可迭代对象。第二个不起作用,因为它是字符串的可迭代对象。

      简而言之,函数期望filetypes 是元组的集合,而在第二种情况下,它只是元组本身

      【讨论】:

        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多