You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现列表与自定义Vector类的双向加法运算

解决Vector类与列表的双向加法问题

嘿,这个问题我太熟悉了!咱们先搞清楚为什么list + vector会报错,再一步步搞定它。

问题根源

当你执行vector + list时,Python会调用vector类的__add__方法,你的代码已经能处理这种情况(只要长度匹配)。但反过来写list + vector时,Python会先尝试调用list自带的__add__方法——可list的加法只认同类型对象,它根本不知道怎么处理vector实例,自然就报错了。

这时候就得用到Python运算符重载里的**反向加法方法__radd__**了!

解决方案:实现__radd__方法

__radd__的作用是:当左侧对象的__add__无法处理右侧的vector时,Python会自动调用右侧vector的__radd__,把左侧的对象(比如这里的list)作为参数传进来。

而且向量加法满足交换律,我们可以直接复用已有的__add__逻辑,不用重复写代码:

def __radd__(self, other):
    # 反向加法直接复用__add__的逻辑,相当于把other和self交换后执行加法
    return self + other

把这个方法加到你的vector类里,list + vector就能正常运行了!

优化建议(可选)

另外,你原来用print提示错误的方式不够规范,更好的做法是抛出异常,这样能让程序更健壮:
比如把__add__里的:

if(len(self)!= len(other)):
    print("Don't add these too ! they are not same types :P")

改成:

if len(self) != len(other):
    raise ValueError("Cannot add vectors of different lengths")

修改后的完整代码

class vector:
    """Initialize Vector"""
    def __init__(self,d):
        self.coords = [0]*d
    
    def __len__(self):
        return len(self.coords)
    
    def __getitem__(self, item):
        #Getting an item from a vector
        return self.coords[item]
    
    def __setitem__(self, key, value):
        self.coords[key] = value
    
    def __add__(self, other):
        if len(self) != len(other):
            raise ValueError("Cannot add vectors of different lengths")
        else:
            result = vector(len(self))
            for i in range(len(result)):
                result[i] = self[i] + other[i]
            return result
    
    def __radd__(self, other):
        # 实现反向加法,支持list + vector
        return self + other
    
    def __sub__(self, other):
        if len(self) != len(other):
            raise ValueError("Cannot subtract vectors of different lengths")
        else:
            result = vector(len(self))
            for i in range(len(result)):
                result[i] = self[i] - other[i]
            return result
    
    def __eq__(self, other):
        return self.coords == other.coords
    
    def __ne__(self, other):
        return self.coords != other.coords
    
    def __str__(self):
        return '<'+ str(self.coords)[1:-1] +'>'

print("Input for vector 1")
x = vector(2)
for i in range(len(x)):
    x[i] = int(input('Enter a number\n'))

print("Input for vector 2")
y = vector(2)
for i in range(len(y)):
    y[i] = int(input('Enter a number\n'))

z = x-y
print(str(x))
print(" + ")
print(str(y))
print(" = ")
print(str(z))

# 测试list + vector
test_list = [5, 6]
print("\n测试list + vector:")
print(test_list + x)

现在你试试运行test_list + x,就能得到正确的向量结果啦!

内容的提问来源于stack exchange,提问作者Dinesh Pabbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:36