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

Python函数传字符串参数失效:未使用传入值而是形参名

问题排查与解决方案

嘿,作为Python新手遇到这种属性访问的坑太正常了,我来帮你一步步搞定!

核心问题:错误的属性访问逻辑

你在sortering函数里的lambda表达式写了x.attribut,这就是问题的关键!当你这么写的时候,Python会默认去获取x对象名为attribut的属性,但你的Djur类根本没有这个属性——你传的参数attribut是字符串(比如'age'),但Python不知道要把它当成属性名来解析。

解决这个问题的正确姿势是用Python内置的getattr()函数,它可以接收对象和属性名字符串,返回对应的属性值。修改后的sortering函数如下:

def sortering(attribut):
    try:
        val1 = input("Vill du sortera stigande eller fallande? s/f")
        if val1 == "s":
            djurlista.sort(key=lambda x: getattr(x, attribut))
            print(*djurlista, sep='\n \n')
        elif val1 == "f":
            djurlista.sort(key=lambda x: getattr(x, attribut), reverse=True)
            print(*djurlista, sep='\n \n')
        else:
            # 补充非s/f输入的提示,比只靠except更全面
            print("Svara med s för stigande eller f för fallande!")
    except AttributeError:
        # 捕获传入不存在属性名的情况
        print(f"Fel: Djurobjekt har ingen egenskap med namnet '{attribut}'!")

另外两个必须修复的bug

除了排序的核心问题,你的代码还有两个会直接导致崩溃的问题:

1. 函数调用时机错误

你把sortering('age')写在了Djur类定义的前面,这时候Djur类还没被定义,djurlista也没有正确初始化,运行时会直接报错。必须把函数调用移到所有类定义和列表初始化之后。

2. __init__方法的无限递归

在Djur的__init__里,你写了:

x = Djur(art, namn, ålder, kön, gravid)
self.djurlista.append(x)

这会触发无限递归!因为每次创建Djur对象时,__init__会被调用,然后又创建一个新的Djur对象,循环往复直到内存溢出。

正确的做法是把djurlista作为全局列表(或者在类外维护),在创建Djur对象时直接把当前对象添加到列表里,而不是在__init__内部新建对象。比如:

# 先初始化全局的动物列表
djurlista = []

class Djur:
    def __init__(self, art, namn, ålder, kön, gravid):
        self.art = art
        self.namn = namn
        self.age = ålder
        self.gender = kön
        self.gravid = gravid
        # 直接把当前对象添加到全局列表,避免递归
        djurlista.append(self)
    
    def __str__(self):
        return (f"Art: {self.art}\nNamn: {self.namn}\nÅlder: {self.age}\nKön: {self.gender}\nGravid: {self.gravid}")
    
    def __repr__(self):
        return str(self)

# 先创建几个测试用的动物对象
Djur("Hund", "Fido", 5, "Hane", False)
Djur("Katt", "Maja", 3, "Hona", True)
Djur("Hamster", "Nalle", 1, "Hane", False)

# 最后调用排序函数
sortering('age')

测试验证

现在运行修改后的代码,当你输入s或者f时,程序会根据你传入的属性名(比如'age')正确排序djurlista里的动物对象啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:46:46