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

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

假设:

attrs, patterns, weight = [] * 3

是相同的:

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


米脂
浏览 199回答 3
3回答

梵蒂冈之花

最好的现有语法是attrs, patterns, weight = [[] for i in range(3)]这并不是真正的改进[], [], []。不过,它对复杂表达式有优势。如果你想要一个函数,你会遇到 Python 函数接受对象而不是表达式的问题。函数不能重复计算其参数表达式。如果你想写一个函数,你必须将表达式包装在 alambda或其他东西中:def n_times(constructor, n):    return [constructor() for i in range(n)]attrs, patterns, weight = n_times(lambda: [], 3)# orattrs, patterns, weight = n_times(list, 3)有一些诱人但错误的选择:# Mistakeattrs = patterns = weight = []# Also a mistakeattrs, patterns, weight = [[]]*3它将相同的列表分配给每个变量而不是创建单独的列表,因为 Python 赋值不会复制,并且列表乘法不会复制元素,只会引用元素。

蝴蝶不菲

如果您想拥有您想要的行为,您可以创建一个行为类似于以下表达式的自定义对象: var1, var2, var3 = __OBJECT__ * 3下面是一个例子:from collections.abc import Iterableclass 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

跃然一笑

a = b = c = []所有变量都独立设置为相同的值。(注意:相同的可变对象,但 Python 中的任何多重赋值都是如此。)赋值语句计算表达式列表 [...] 并将单个结果对象从左到右分配给每个目标列表。当我第一次在即时会话中尝试时,这让我感到惊讶!但它正如你所期望的那样工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python