为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2021-09-23 09:45:07
是否有现有的 Python 内置函数可以分配两个或多个变量并在分配单个表达式时返回多个值?例如:假设:attrs, patterns, weight = [] * 3是相同的:attrs, patterns, weight = [], [], []
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

最好的现有语法是


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)

# or

attrs, patterns, weight = n_times(list, 3)

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


# Mistake

attrs = patterns = weight = []

# Also a mistake

attrs, patterns, weight = [[]]*3

它将相同的列表分配给每个变量而不是创建单独的列表,因为 Python 赋值不会复制,并且列表乘法不会复制元素,只会引用元素。


查看完整回答
反对 回复 2021-09-23
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

如果您想拥有您想要的行为,您可以创建一个行为类似于以下表达式的自定义对象: 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


查看完整回答
反对 回复 2021-09-23
?
跃然一笑

TA贡献1826条经验 获得超6个赞

a = b = c = []

所有变量都独立设置为相同的值。(注意:相同的可变对象,但 Python 中的任何多重赋值都是如此。)

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

当我第一次在即时会话中尝试时,这让我感到惊讶!但它正如你所期望的那样工作。


查看完整回答
反对 回复 2021-09-23
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号