python报错:tuple indices must be integers or slices,not str

Python对象属性值获取的正确方式
该文章已生成可运行项目,

1、问题概述?

错误取值:object['attrName']

获取python对象属性的时候报错:tuple indices must be integers or slices,not str

翻译为:元组索引必须是整数或切片,而不是str

正确用法:object[0],需要通过索引获取值,而非属性名称

2、使用场景描述

在python中通过id查询出一条数据,想获取数据对应字段的值,查询语句如下:

def findObjectById(id):
    conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123456', port=3306, db='test',charset='utf8')
    cursor = conn.cursor()
    sql ='select * from  test WHERE id="'+id+'"
    cursor.execute(sql)
    object=cursor.fetchone()
    conn.close()
    if object == None:
        exit()
    return object

3、获取对象属性对应的值方式

错误用法:object.id

正确用法:object[0],需要通过索引获取值,而非属性名称

本文章已经生成可运行项目
Python 中,`TypeError: tuple indices must be integers or slices, not str` 表示你尝试用**字符串(str)作为索引访问元组(tuple)**,但元组只允许**整数(int)或切片(slice)**作为索引。 --- ## **错误原因** 元组(`tuple`)是**不可变序列**,其索引方式类似于列表(`list`),但**不能使用字符串作为键**(字典 `dict` 才支持字符串键)。 ```python my_tuple = ("apple", "banana", "cherry") # ✅ 正确:用整数索引 print(my_tuple[0]) # "apple" # ✅ 正确:用切片 print(my_tuple[1:3]) # ("banana", "cherry") # ❌ 错误:尝试用字符串索引 print(my_tuple["name"]) # TypeError: tuple indices must be integers or slices, not str ``` --- ## **常见引发场景 & 解决方法** ### **1. 误把元组当字典用** **错误代码** ```python person = ("Alice", 25) print(person["name"]) # ❌ 错误:元组不能用字符串索引 ``` **✅ 正确做法** - 如果要用字符串键访问数据,应该用**字典(dict)**: ```python person = {"name": "Alice", "age": 25} print(person["name"]) # ✅ 正确:"Alice" ``` --- ### **2. 遍历元组时误用 `.items()`(字典方法)** **错误代码** ```python fruits = ("apple", "banana", "cherry") for key, value in fruits.items(): # ❌ 元组没有 .items() 方法 print(key, value) ``` **✅ 正确做法** - 元组可以直接遍历,不需要 `.items()`: ```python fruits = ("apple", "banana", "cherry") for fruit in fruits: # ✅ 直接遍历 print(fruit) ``` - 如果需要索引,可以用 `enumerate()`: ```python for idx, fruit in enumerate(fruits): print(idx, fruit) # 0 apple, 1 banana, 2 cherry ``` --- ### **3. 函数返回元组,但尝试用字符串访问** **错误代码** ```python def get_user(): return ("Alice", 25) user = get_user() print(user["name"]) # ❌ 错误:返回的是元组,不是字典 ``` **✅ 正确做法** - 如果要用键值对,返回字典: ```python def get_user(): return {"name": "Alice", "age": 25} # ✅ 返回字典 user = get_user() print(user["name"]) # "Alice" ``` - 或者用索引访问元组: ```python user = get_user() # ("Alice", 25) print(user[0]) # "Alice"(但可读性差) ``` --- ### **4. 误用 `namedtuple`(需先定义结构)** 如果想用**类似字典的字符串键访问元组**,可以用 `collections.namedtuple`: ```python from collections import namedtuple # ✅ 先定义结构 Person = namedtuple("Person", ["name", "age"]) person = Person("Alice", 25) print(person.name) # "Alice"(可以用 .name 访问) print(person[0]) # "Alice"(仍然支持索引) ``` --- ## **总结** | 数据类型 | 索引方式 | 示例 | |----------|---------|------| | **元组(tuple)** | 仅 `int` 或 `slice` | `my_tuple[0]` | | **列表(list)** | 仅 `int` 或 `slice` | `my_list[1:3]` | | **字典(dict)** | `str` 或 `int` 等可哈希类型 | `my_dict["key"]` | | **namedtuple** | 支持 `.属性名` 和 `[索引]` | `person.name` | **关键点**: - **元组和列表**只能用**数字索引**(`[0]`、`[1:3]`)。 - **字典**可以用**字符串键**(`["key"]`)。 - 如果需要**类似字典的元组**,用 `namedtuple`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值