【问题标题】:Is the definition of these variables necessary?这些变量的定义是否必要?
【发布时间】:2020-01-10 02:32:57
【问题描述】:

我没有编写此代码,它是作为课程作业的一部分提供的。

我正在完成熨斗准备工作,发现这很有趣。

first_name = ""
last_name = ""
for key, value in example_dictionary.items():
    if key == "last_name":
        last_name = value.title()
    if key == "first_name":
        first_name = value
print(first_name, last_name)

然后我决定在没有初始 first_name = "" last_name = "" 的情况下尝试这个

这样

for key, value in example_dictionary.items():
    if key == "last_name":
        last_name = value.title()
    if key == "first_name":
        first_name = value
print(first_name, last_name) 

而且它似乎仍然有效。如果看起来没有必要,我能解释一下他们为什么定义 first_namelast_name 吗?

【问题讨论】:

  • 如果您的字典缺少first_name 键会怎样?
  • 你的意思是说没有首字母吗?
  • @Barmar 这是一个很好的问题,但是我们使用这个键的原因是因为它是字典的一部分。
  • 但是他们初始化变量的原因是,如果缺少键,他们不会得到错误。
  • @Barmar 不,我只是说他们在一开始就定义了这两个变量,就像最初一样

标签: python for-loop variables


【解决方案1】:

如果字典没有相应的键,则默认使用初始值。有条件地分配变量是一个非常常见的编程错误,而忘记处理条件永远不会发生的情况。一开始就初始化变量可以避免这个错误。

另一种编写方式是不使用循环。

first_name = example_dictionary.get("first_name", "")
last_name = example_dictionary.get("last_name", "")

.get() 的第二个参数是在字典中不存在键时返回的默认值。

【讨论】:

    【解决方案2】:

    在不了解上下文的情况下,我们无法确定。但一般来说,如果这些变量在循环之前没有初始化,并且循环中也没有初始化它们,那么它们在循环之后可能不存在,并且当您尝试使用它们时会引发异常。最好在循环之前将它们初始化为不可能的已知状态,以便以下代码能够更好地解释它在其中找到的值。

    或者如果它们在此之前被初始化,它们可能包含您不想要的先前操作的剩余部分。

    【讨论】:

      【解决方案3】:

      “必要”在这里可能定义不明确,但如果我们从严格意义上说,没有必要,如前所述,没有初始行的程序“似乎仍然有效”。

      可能更有用的是询问删除这些行的后果是什么。

      您的代码片段的最后一条语句print(first_name, last_name) 尝试评估名称,即标识符first_namelast_name。 Python 将首先尝试在本地变量范围内解析这些名称,然后是全局变量范围。如果无法解析名称,则该语句的执行将停止,并引发NameError。名称错误只是一个例外,可以以正常方式为handled(尽管捕获NameErrors 有点不寻常)。

      因此,从代码中删除这些初始变量分配的结果是

      1. first_namelast_name 不再具有“默认值”,但 Barmar's answer 提供了另一种保留此值的方法。
      2. 如果在example_dictionary 中找不到first_namelast_name 作为键,您的代码不会优雅地继续使用默认值,而是会引发NameError。在某些情况下,这实际上可能更可取,毕竟,exceptions 旨在告诉我们什么时候发生了异常。假设您的代码在继续之前确实需要分配一个有意义的last_namefirst_name。最好在此处引发异常并停止执行,而不是继续处理无意义的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 2019-11-04
        • 2015-08-04
        • 1970-01-01
        相关资源
        最近更新 更多