【问题标题】:Problem with list of strings in pythonpython中字符串列表的问题
【发布时间】:2010-11-26 23:07:03
【问题描述】:

为什么每次我这样做时解释器都不会引发 SyntaxError:

my_abc = ['a',
          'b',
          'c'
          'd',]

我只是想将“c”添加到字符串列表中,而忘记附加逗号。我希望这会导致某种错误,因为它显然是不正确的。

相反,我得到了什么:

>>> my_abc
 ['a', 'b', 'cd']

而这从不是我想要的。

为什么会自动连接?我几乎数不清我被这种行为咬了多少次。 有什么我可以用它做的吗?

只是为了澄清*:我实际上并不介意自动连接,我的问题只与字符串列表有关,因为它们通常不仅仅是携带文本,它们是用于控制流程,传递字段名称和许多其他东西。

【问题讨论】:

    标签: python list


    【解决方案1】:

    被称为“隐式字符串连接”并且提议将其删除的 PEP 被拒绝:http://www.python.org/dev/peps/pep-3126/

    【讨论】:

      【解决方案2】:

      这是设计使然。例如,它允许在不使用 + 的情况下在多行中编写长字符串文字。

      【讨论】:

      • 我宁愿对多行字符串使用 """ 或用 `` 明确地打破它们,而不是这种 magic 连接。
      • """ 在行之间添加换行符。
      • 这不是“魔法”。有据可查:docs.python.org/reference/…
      【解决方案3】:

      因为两个由空格分隔的字符串文字并排连接在一起。由于字符串在列表中,因此它们是“并排”的。

      见:http://docs.python.org/reference/lexical_analysis.html#string-literal-concatenation

      【讨论】:

      • 问题是为什么。您只是简单地重申了正在发生的事情,OP 已经在他的帖子中提到了这一点。如果问题问“为什么 10*2 = 20”,回答“因为 10*2 = 20”没有帮助。
      • 文档中解释了为什么 - 它是设计使然并且有用例。
      【解决方案4】:

      正如其他人所说,这是设计使然。

      为什么会这样?主要是出于历史原因:C 也这样做。

      在某些情况下它很方便,因为它可以减少语法噪音并避免添加不需要的空格(内联 SQL 查询、复合正则表达式等)。

      你能做些什么呢?不多,但如果它真的经常发生在您身上,请尝试以下技巧之一。

      • 在行首用逗号缩进您的列表。这很奇怪,但如果你这样做,失踪的昏迷就会变得很明显。
      • 将字符串分配给变量并尽可能使用变量列表(出于其他原因,这通常是个好主意,例如避免重复字符串)。
      • 拆分您的列表:对于单词列表,您可以将整个列表放在一个字符串中,然后像下面那样拆分它。对于超过 5 个元素,它也更短。

        'a b c d e'.split(' ').

      【讨论】:

      • 或者在每一项后加逗号(包括最后一项);解释器允许额外的逗号。这样,如果您将列表格式化为每行一个值并向上或向下移动项目,则不会遇到此问题。
      • 这似乎是原始问题海报的内容(这也是我通常出于您刚才所说的原因而做的事情),但是行尾缺少昏迷很容易看不到。我也遇到了相反的问题:行尾的尾随昏迷将常量更改为元组。我相信这个比另一个更难检测到:-(
      【解决方案5】:

      因为人们经常想做这样的事情:

      line = ("Here's a very long line, with no line breaks,"
              " which should be displayed to the user (perhaps"
              " as an error message or question box).")
      

      无需手动连接字符串即可更轻松地编写此代码。 C、C++ 和(我相信)Java 和 C# 也有这种行为。

      【讨论】:

      • """ 不这样做。它插入换行符。
      • @kurczak:40 年的开发者不同意你的观点。
      • @John Millikin 请详细说明
      • 至少从大约 40 年前发布的 C 语言开始,自动字符串连接就出现在大多数语言中。虽然功能的年龄并不一定意味着它是一个好主意,但它 1)在数十种后代语言中保持不变 2)被不相关的语言采用这一事实表明它通常被认为是一个好主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2016-11-06
      • 2018-10-08
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多