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

如何将变量添加至列表?Python添加Person实例至列表报错求助

问题分析与修复方案

先把你代码里的问题逐一列出来:

  • Input类里创建实例时写了NewPerson,但你定义的类是Person,这是拼写错误,会直接报错。
  • List类的data_to_list方法里,self.surnam = surnam是拼写错误,应该是self.surname = surname。
  • 你用list.extend()的方式完全错误:extend接受的是一个可迭代对象(比如列表),而且它是原地修改列表,返回值是None,所以你把list = list.extend(...)赋值后,list会变成None。
  • List类的设计逻辑有问题:应该在类内部维护一个存储Person实例的列表,而不是每次调用方法都新建空列表,而且没必要把Person的属性拆分后再添加,直接把整个Person实例加进去更合理。
  • 你看到的<__main__.List object at 0x0000027FD63B6B60>,是因为你直接打印了List类的实例,而这个类没有定义__str__方法,Python会默认输出对象的内存地址。

下面是修正后的完整代码:

class Person:
    def __init__(self, name, surname, age, phone_number):
        self.name = name
        self.surname = surname
        self.age = age
        self.phone_number = phone_number

    def __str__(self):
        return f"\n{self.name}\t{self.surname}\t{self.age}\t{self.phone_number}"


class Input:
    def input_data(self):
        name = input("\nInsert a name: \n")
        surname = input("Insert a surname: \n")
        age = int(input("Insert an age: \n"))
        phone_number = input("Insert a phone number: \n") 
        # 修正拼写错误,用正确的Person类创建实例
        person = Person(name, surname, age, phone_number)
        return person


class PersonList:
    # 改名避免和内置list冲突
    def __init__(self):
        # 内部维护一个存储Person实例的列表
        self.people = []

    def add_person(self, person):
        # 直接添加整个Person实例
        self.people.append(person)

    def __str__(self):
        # 定义打印方法,返回所有Person的字符串拼接
        return "".join(str(p) for p in self.people)


# 测试代码
if __name__ == "__main__":
    input_handler = Input()
    person_list = PersonList()
    
    # 获取输入并添加到列表
    new_person = input_handler.input_data()
    person_list.add_person(new_person)
    
    # 打印列表内容
    print(person_list)

关键修改说明:

  1. 把List类改名为PersonList,避免和Python内置的list类重名,减少混淆。
  2. 在PersonList的__init__里初始化self.people = [],用来存储所有Person实例。
  3. 新增add_person方法,直接接收Person实例并通过append添加到内部列表(append用于添加单个元素,extend用于添加可迭代对象的所有元素,这里用append更合适)。
  4. 给PersonList添加__str__方法,这样直接打印实例时会输出所有Person的信息,而不是内存地址。
  5. 修正Input类里的NewPerson为Person,并且去掉了不必要的实例属性存储,直接用局部变量接收输入更简洁。

现在运行测试代码,输入信息后就能正确打印出添加的Person内容,不会再出现内存地址的输出了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:01:03