内置函数可应用带有多个变量的单个表达式

时间:2018-12-21 22:44:46

标签: python

是否存在一个现有的Python内置函数来分配两个或多个变量,并在分配一个表达式时返回多个值?例如:

假设:

attrs, patterns, weight = [] * 3

与以下相同:

attrs, patterns, weight = [], [], []

3 个答案:

答案 0 :(得分:2)

目前最好的语法是

attrs, patterns, weight = [[] for i in range(3)]

实际上不是对[], [], []的改进。不过,它对于复杂的表达式有优势。

如果想要一个函数,则会遇到Python函数需要对象而不是表达式的问题。函数不能重复评估其参数表达式。如果要编写函数,则必须将表达式包装在lambda或类似的东西中:

def n_times(constructor, n):
    return [constructor() for i in range(n)]

attrs, patterns, weight = n_times(lambda: [], 3)
# or
attrs, patterns, weight = n_times(list, 3)

有一些诱人但错误的选择:

# Mistake
attrs = patterns = weight = []
# Also a mistake
attrs, patterns, weight = [[]]*3

same 列表分配给每个变量,而不是创建单独的列表,因为Python分配不会创建副本,并且列表乘法不会复制元素,仅会引用元素。 / p>

答案 1 :(得分:0)

如果您想拥有自己想要的行为,则可以创建一个行为类似于以下表达式的自定义对象:var1, var2, var3 = __OBJECT__ * 3

这里是一个例子:

from collections.abc import Iterable

class Custom:   
     def __init__(self, initial=[]):
         if not isinstance(initial, Iterable):
             raise ValueError()
         self.initial = initial
         self.args = initial

     def __mul__(self, args):
         self.args = [self.initial[:] for _ in range(args)]
         return self.args

     def __iter__(self):
         for _ in range(len(self.args)):
             yield self.initial

     def __repr__(self):
         return '{}'.format(list(self))

演示:

$> a, b, c = Custom() * 3
$> print(a, b, c) # [] [] []
$> id(a) == id(b) == id(c) # False

$> a, b, c = Custom(()) * 3
$> print(a, b, c) # () () ()
$> id(a) == id(b) == id(c) # True

答案 2 :(得分:0)

a = b = c = []

所有变量都独立设置为相同的值。 (警告:同一个可变对象,但对于Python中的任何多重分配都是如此。)

请参阅assignment statement的文档-允许使用多个target_list "="部分。

  

赋值语句评估表达式列表[...]并将单个结果对象从左到右分配给每个目标列表。

当我在即时会话中首次尝试时,这真让我感到惊讶!但这确实如您所愿。