设为首页
收藏本站
切换到宽版
登录
注册
找回密码
搜索
搜索
本版
文章
帖子
用户
快捷导航
易学开发平台
易学在线课堂
易学智能论坛
BBS
易学智能
»
易学智能论坛
›
技术大讨论
›
Python开发
›
TypeError: 'tuple' object does not support item assi ...
返回列表
查看:
2108
|
回复:
2
TypeError: 'tuple' object does not support item assignment
[复制链接]
I_Like_AI
I_Like_AI
当前离线
积分
310
15
主题
97
帖子
310
积分
论坛管理
积分
310
发消息
发表于 2018-9-19 08:55:52
|
显示全部楼层
|
阅读模式
运行下面代码
tup = ([1,2,3],[7,8,9])
tup[0] += (4,5,6)
复制代码
生成此错误:
TypeError: 'tuple' object does not support item assignment
虽然这段代码:
tup = ([1,2,3],[7,8,9])
try:
tup[0] += (4,5,6)
except TypeError:
print tup
复制代码
然而输出tup:
([1, 2, 3, 4, 5, 6], [7, 8, 9])
这种行为是合理的吗?
回复
使用道具
举报
马猴烧酒
马猴烧酒
当前离线
积分
266
22
主题
107
帖子
266
积分
中级会员
中级会员, 积分 266, 距离下一级还需 234 积分
中级会员, 积分 266, 距离下一级还需 234 积分
积分
266
发消息
发表于 2018-9-19 08:57:47
|
显示全部楼层
是的,这是合理的。
元组无法更改。像列表一样的元组是指向其他对象的结构。它并不关心那些对象是什么。它们可以是字符串,数字,元组,列表或其他对象。
因此,对元组中包含的某个对象执行任何操作,包括如果它是列表,则附加到该对象,与元组无关。
或者另一个例子:
>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> t = (l1, l2)
>>> l3 = [l1, l2]
>>> l3[1].append(7)
复制代码
由列表和元组引用的两个可变列表。最后一行不会报错。
如果你想要一个连续结构的不可变对象,那么它应该一直是元组。
为什么会出错?
l = [1, 2, 3]
tup = (l,)
tup[0] += (4,5,6)
复制代码
相当于:
l = [1, 2, 3]
tup = (l,)
x = tup[0]
x = x.__iadd__([4, 5, 6]) # like extend, but returns x instead of None
tup[0] = x
复制代码
该__iadd__行成功,并修改第一个列表。所以列表已经改变了。该__iadd__调用返回变异列表。
第二行尝试将列表分配回元组,这会失败。
因此,在程序结束时,列表已被扩展,但操作的第二部分+=失败。
回复
使用道具
举报
黑崎一护
黑崎一护
当前离线
积分
131
13
主题
53
帖子
131
积分
注册会员
注册会员, 积分 131, 距离下一级还需 69 积分
注册会员, 积分 131, 距离下一级还需 69 积分
积分
131
发消息
发表于 2018-9-19 08:58:18
|
显示全部楼层
嗯,我想tup[0] += (4, 5, 6)等价于:
tup[0] = tup[0].__iadd__((4,5,6))
tup[0].__iadd__((4,5,6))通常在第一个元素中更改列表。但由于元组是不可变的,因此赋值失败
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表