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

Why do new variable names need to be on the left of the equals (=)?

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

有效代码:

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 = 最终出现了。我总是把变量放在左边,所以我不知道为什么它需要放在右边。

谢谢!

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

毕竟,你写:

num = 3

而不是

3 = num

对吗?

如果您是编程新手或者您更熟悉数学符号,= 的概念可能会造成混淆,因为它实际上并不是 等价 ,更像是命名。当您编写 name = value 形式的语句时,例如 foo = 0,这意味着“获取值 0 并将其存储在名称 foo 下”。如果有助于您的理解,您可以将 name 视为标签。

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

first_name, last_name = name

如果我们用引用的值替换name,它变得更清楚:

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

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

first_name = 'John'
last_name = 'Doe'

作为参考,Python 语言参考中解释了确切的语义:Assignment statements。 (语法上,target_list有多个targets,都是identifier,RHS是一个starred_expression,归结为primary -> atom -> identifier.)