python - 为什么新变量名需要在等号 (=) 的左侧?

我很好奇为什么某种格式会产生错误而另一种不会。

有效的代码:

name = input().split()

if len(name) == 3:
  first_name, middle_name, last_name = name
  print(f'{last_name}, {first_name[0]}.{middle_name[0]}.')

elif len(name) == 2:
  first_name, last_name = name
  print(f'{last_name}, {first_name[0]}.')

不起作用的代码:

name = input().split()

if len(name) == 3:
  name= first_name, middle_name, last_name
  print(f'{last_name}, {first_name[0]}.{middle_name[0]}.')

elif len(name) == 2:
  name = first_name, last_name
  print(f'{last_name}, {first_name[0]}.')

这两者的唯一区别在于第 4 行和第 8 行,其中 name = 最终存在。我总是把变量放在左边,所以我不知道为什么它需要放在右边。

谢谢!

回答1

这些说的是完全不同的两件事。第二个采用三个对象(first_name、middle_name、last_name),然后将它们构建成一个元组,并将其分配给 name。这显然不是您想要的,因为这三个名称不存在。您的第一个示例采用变量 name 的三个部分(确实存在),并将它们解压缩到这三个对象中。您的第二个示例不是您编写赋值语句的方式。分配将右侧的内容分配给左侧的内容。

毕竟,你写:

num = 3

并不是

3 = num

正确的?

回答2

如果您是编程新手或者您更熟悉数学符号,那么 = 的概念可能会令人困惑,因为它实际上不是等价物,它更像是命名。当您编写 name = value 形式的语句时,例如 foo = 0,这意味着“将 value 0 和 store 放在名称 foo 下”。如果这有助于您的理解,您可以将 name 视为一个标签。

在您的情况下,您希望从列表 name 和 store 中获取字符串,它们分别位于标签 first_name、可能是 middle_namelast_name 下。为了演示,假设 name['John', 'Doe']。这意味着您要在 first_name 下的 store 'John'last_name 下的 'Doe'。所以你怎么做就是写,

first_name, last_name = name

如果我们将 name 替换为它引用的 value,它会变得更清楚:

first_name, last_name = ['John', 'Doe']

然后 Python 解包列表,这等效于:

first_name = 'John'
last_name = 'Doe'

作为参考,Python 语言参考:https://docs.python.org/3/reference/simple_stmts.html#assignment-statements中解释了确切的语义。 (在语法上,target_list 有多个 targets,它们都是 identifier,而 RHS 是一个 starred_expression,归结为 primary -> atom -> identifier .)

相似文章

python - Python - 在多行和多列中比较 values

我是Python的新手,我有一个如下所示的数据框(请参阅原始数据table)。最终目标是协调来自2个系统(sys1与sys2,在“源”列中标记)的记录(即id、rg、prd和数量)。我如何使用1个函数...

随机推荐

最新文章