我正在阅读一本关于Python的书,关于多目标任务的书中有一个特殊的部分。现在这本书解释如下:
但是我没有看到这个的使用。这对我来说毫无意义。为什么要使用更多变量?
有理由这样做吗?是什么让这与使用a='spam'
如此不同,然后打印出a
3次?
我只能想到用它来清空一行中的变量。
答案 0 :(得分:6)
多次分配的一个很好的用途是将一堆变量设置为相同的数字。
以下是演示:
>>> vowels = consonants = total = 0
>>> mystr = "abcdefghi"
>>> for char in mystr:
... if char in "aeiou":
... vowels += 1
... elif char in "bcdfghjklmnpqrstvwxyz":
... consonants += 1
... total += 1
...
>>> print "Vowels: {}\nConsonants: {}\nTotal: {}".format(vowels, consonants, total)
Vowels: 3
Consonants: 6
Total: 9
>>>
如果没有多次分配,我必须这样做:
>>> vowels = 0
>>> consonants = 0
>>> total = 0
正如你所看到的,这是一个更长篇大论。
总结一下,多重赋值只是Python语法糖,使事情变得更容易/更清晰。
答案 1 :(得分:2)
这主要是为了方便。如果你想初始化一堆变量,那么在一行上完成它们比在几行上更方便。这本书甚至提到在你引用的片段的末尾:“例如,在将一组计数器初始化为零时”。
除此之外,这本书实际上是错误的。显示的例子
a = b = c = 'spam'
不等同于
c = 'spam'
b = c
a = b
它真正做的基本上是
tmp = 'spam'
a = tmp
b = tmp
c = tmp
del tmp
注意分配的顺序!当某些目标相互依赖时,这会有所不同。例如,
>>> x = [3, 5, 7]
>>> a = 1
>>> a = x[a] = 2
>>> a
2
>>> x
[3, 5, 2]
根据该书,x[1]
将成为2
,但显然情况并非如此。
如需进一步阅读,请参阅以前的Stack Overflow问题:
How do chained assignments work?
What is this kind of assignment in Python called? a = b = True
可能还有其他几个(请查看右侧边栏上的链接)。
答案 2 :(得分:1)
您可能需要使用相同的值初始化多个变量,然后以不同的方式使用它们。 它可能是这样的:
def fibonacci(n):
a = b = 1
while a < n:
c = a
a = a + b
b = c
return a
(变量交换与元组解包,以避免与downvoted答案混淆)
重要提示:
>>> a = b = []
很危险。它可能不会做你认为它做的事情。
>>> b.append(7)
>>> print(b)
[7]
>>> print(a)
[7] # ???????
这是由于变量如何在Python中用作名称或标签,而不是其他语言中的值的容器。有关完整说明,请参阅this答案。
答案 3 :(得分:0)
据推测,你继续使用不同的变量做其他。
a = do_something_with(a)
b = do_something_else_with(b)
#c is still 'spam'
琐碎的例子和初始化步骤可疑并没有为您节省任何工作,但这是一种有效的编码方式。肯定有需要初始化大量变量的地方,只要它们是不可变的,这个成语就可以节省空间。
虽然正如本书所指出的那样,你只能将此类语法用于不可变类型。对于可变类型,您需要显式创建多个对象:
a,b,c = [mutable_type() for _ in range(3)]
否则你最终得到surprising results,因为你有三个对同一个对象的引用而不是三个对象。