gpt4 book ai didi

python - 运算符 += 在 Python 中返回什么

转载 作者:行者123 更新时间:2023-12-04 04:24:59 24 4
gpt4 key购买 nike

原始问题
当我试图在stackoverflow上回答另一个人关于=之间的区别的问题时和 +=在Python中,我遇到了以下问题:

class Foo:
def __init__(self, value, name="default"):
self.value = value
self.name = name

def __add__(self, that):
return Foo(self.value + that.value)

def __iadd__(self, that):
self.value = self.value + that.value
return self

def __str__(self):
return "name: {}, value: {:d}".format(self.name, self.value)

a = Foo(1, 'alice')
b = Foo(2, 'bob')
print(a+=b)
最后 print通话不成功,给了我这个:
File "<ipython-input-8-0faa82ba9e4a>", line 3
print(a+=b)
^
SyntaxError: invalid syntax
我不知道为什么这不起作用。也许它与关键字参数传递机制有关?我只是找不到关于这个主题的任何资源,因为过载 __iadd__方法已经返回 Foo目的。
************** 更新 ******************
如果我更改 __iadd__像这样的方法(只需删除 return 语句):
...
def __iadd__(self, that):
print("__iadd__ was called")
self.value = self.value + that.value

a = Foo(1, 'alice')
b = Foo(2, 'bob')
a += b
print(a) # Outputs: None
所以,最后的 return __iadd__ 中的声明确实是必需的。但它并没有像我想象的那样起作用(我来自 C/C++ 背景,所以这种行为对我来说有点奇怪)
************************* 第二次更新 ************************* *********
我几乎忘记了 =在 Python 中,组成一个语句而不是一个表达式。 return __iadd__ 中的声明而我使用其他语言的经验让我产生了一种错觉,即 +=可以用作表达式。
如 Python 文档中所述, __add__用于构造新对象。 __iadd__专为就地修改而设计。但这一切都取决于实现。虽然 __iadd__返回一个对象,该对象以某种方式被语言“拦截”并重新分配给左手运算符,最后的效果是, __iadd__仍然是一个语句,而不是一个表达式。如果我错了,请纠正我。此外,我没有找到任何资源确认 +=是一个声明。
概括
  • 一个简单的代码,比如 a = 1是一个赋值语句。它不允许用作函数参数。但是,关键字参数传递不受此限制:print('Hello world', end='')仍然有效。

  • x = x + y相当于x = x.__add__(y) ,
  • x += y相当于x = x.__iadd__(y) ,查看文档以获取更多详细信息。

  • 一个例子:
  • class Foo:
    def __init__(self, value, name="default"):
    self.value = value
    self.name = name

    def __add__(self, that):
    return Foo(self.value + that.value)

    def __iadd__(self, that):
    self.value = self.value + that.value
    return self

    def __str__(self):
    return "name: {}, value: {:d}".format(self.name, self.value)

    a = Foo(1, 'alice')
    b = Foo(2, 'bob')
    c = a + b # objects a and b are unchanged
    a += b # object a is changed
    print(c) # name: default, value: 3
    print(a) # name: alice, value: 3

    最佳答案

    分配/就地操作不能被视为可以传递的表达式,这是设计使然。
    除其他外,Guido 想避免臭名昭著的 C 错字

    if (a=b)  // user actually wanted to test a==b
    但是 python 3.8 提供了一种新的赋值方法,称为 assignment expression这允许将分配的值作为参数传递(这在列表推导中非常方便)。
    您仍然无法进行就地添加,但您可以先添加然后分配:
    >> a=2
    >> b=3
    >> print(a:=a+b)
    5

    关于python - 运算符 += 在 Python 中返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66373149/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com