多目标分配

时间:2013-12-11 15:39:35

标签: python variable-declaration

我正在阅读一本关于Python的书,关于多目标任务的书中有一个特殊的部分。现在这本书解释如下:

enter image description here

但是我没有看到这个的使用。这对我来说毫无意义。为什么要使用更多变量? 有理由这样做吗?是什么让这与使用a='spam'如此不同,然后打印出a 3次?

我只能想到用它来清空一行中的变量。

4 个答案:

答案 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

Python - are there advantages/disadvantages to assignment statements with multiple (target list "=") groups?

可能还有其他几个(请查看右侧边栏上的链接)。

答案 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,因为你有三个对同一个对象的引用而不是三个对象。