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

Python循环调用自定义函数报错:'str'对象无'domain'属性,求修正

问题分析与修正方案

错误原因

你遇到的AttributeError核心问题是函数调用方式错误:
你写的i.domain(email, old_domain, new_domain)是把domain当成了字符串对象i的方法来调用,但domain是你自己定义的独立函数,并非Python字符串的内置方法。字符串类型根本没有名为domain的属性,所以会抛出这个错误。

另外原代码还有一个隐藏问题:email列表的定义缩进在了domain函数的return语句之后,属于函数内部代码,这行代码永远不会被执行,而且函数外的for循环无法访问到这个变量(不过从你的报错信息看,可能是粘贴代码时的缩进失误)。

修正后的代码

def domain(email, old_domain, new_domain):
    if "@" + old_domain in email:
        index = email.index("@" + old_domain)
        new_email = email[:index] + "@" + new_domain
        return new_email
    return email

# 将email列表移到函数外部,确保for循环能访问到
email = ['sandeep@yahoo.com', 'maini@gmail.com', 'venky@yahoo.com', 'karupi@gmail.com']

old_domain = "yahoo.com"
new_domain = "gmail.com"

# 正确调用独立函数domain,把当前遍历的邮箱i作为第一个参数传入
for i in email:
    print(domain(i, old_domain, new_domain))

运行结果

执行修正后的代码会输出:

sandeep@gmail.com
maini@gmail.com
venky@gmail.com
karupi@gmail.com

额外优化建议

如果你的邮箱格式都是标准的xxx@domain.com,可以用字符串的split方法简化domain函数的逻辑,代码更简洁易读:

def domain(email, old_domain, new_domain):
    local_part, domain_part = email.split("@", 1)
    if domain_part == old_domain:
        return f"{local_part}@{new_domain}"
    return email

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:45:39