我很好奇为什么某种格式会产生错误而另一种不会。
有效的代码:
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_name
和 last_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
.)