【问题标题】:Add multiple return values to multiple variables in Python [duplicate]在Python中为多个变量添加多个返回值[重复]
【发布时间】:2017-10-03 20:20:18
【问题描述】:

分配

我是 Python 新手,但我已经知道使用所谓的元组可以分配和返回多个值。

一次分配多个值

> a, b = 1, 2
> a
1
> b
2

返回多个值

> def f():
>   return 3, 4
>
> f()
(3, 4)

两者结合也有效

> c, d = f()
> c
3
> d
4

添加

要向变量隐式添加返回值,可以使用重载运算符+= (iadd)。

添加运算符+=(分别称为iadd

> e = 5
> e += 5
> e
10

也适用于函数

> def g():
>   return 10
>
> e += g()
> e
20

问题

我是对的,上述行为不能一起使用吗? 我尝试了以下 sn-p 但它对我不起作用。

> x, y = 1, 2
> x, y += 3, 4
SyntaxError: illegal expression for augmented assignment

> def z():
>   return 10, 100
> x, y += z()
SyntaxError: illegal expression for augmented assignment

到目前为止,Python 非常直观。这就是为什么我认为方法可以开箱即用。

为什么不为元组重载 += 运算符?保持 Python 尽可能简单不是很有意义吗?

我找到了两种方法来解决这个“问题”(使用上面的xyz()):

> import operator
> t = x, y
> tuple(map(operator.add, t, z()))

或保持简单(使用上面的xyz()):

> x1, y1 = z()
> x += x1
> y += y1

除了我提到的方法之外,还有更好甚至更直观的方法吗?

【问题讨论】:

  • 为什么不为元组重载 += 运算符?元组是不可变的,添加任何东西到元组没有多大意义。跨度>
  • @ŁukaszRogalski 但xy 都不是元组,那么我们试图改变的元组是哪一个?
  • += for tuples 意味着做一些类似外推的事情,即求和形式的总和,我想如果Python 将其视为合法表达式,这就是您所期望的结果。跨度>
  • this StackOverflow answer 有更多关于增强分配的信息
  • 就这个问题的哲学答案而言:它会在元组和列表之间造成不对称。 += 运算符已经对列表有意义:它扩展了它们。如果+= 对元组执行逐元素加法,则列表的行为将是不对称的——列表的可变性应该与元组不同。

标签: python


【解决方案1】:

我喜欢列表理解。学习python,这绝对是你要研究的东西:

def add_for_all(sum1, sum2):
  return [j+sum2[i] for i,j in enumerate(sum1)]

wx = [1,2]
yz = [3,4]

print (add_for_all(wx, yz))

【讨论】:

  • 很公平,但我怀疑这个问题是关于你如何做到这一点,而是关于为什么它不能像 OP 试图做到的那样工作。
  • 我明白了。不知何故,包含问号的句子(例如,“除了我提到的方法之外,还有更好或更直观的方法吗?”)鼓励我投入 5 美分;)
  • 列表理解非常有用,这是我喜欢 Python 的众多优点之一!但在我看来,对于我的特定用例来说有点过头了。但你是对的:这是另一种可行的方法!
【解决方案2】:

你是对的,你不能同时使用这些方法,这就是原因(据我所知):

当您使用= 运算符时,Python 的工作方式是计算= 右侧的所有表达式,然后将其应用于左侧(这就是您可以使用多重赋值技巧的原因。有关此内容的更多信息,请阅读 python 中的打包和解包)。

当您使用+= 运算符时,它会在左侧对象上调用__iadd__ 方法,并将右侧表达式作为参数进行评估。由于您不能将内容“添加”到元组,而只能添加到可变对象(阅读有关 python 中的可变和不可变的内容),因此此操作是不合法的。

您认为x, y += x1, y1 的操作应该做的是map 函数所做的:它对每个元素逐个进行操作。
您展示的另一个解决方案是我会这样做的方式。如果您之后需要z() 的结果,这也很好。

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 2014-09-12
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2016-01-18
    • 2015-06-26
    相关资源
    最近更新 更多