鱼C论坛

 找回密码
 立即注册
查看: 1893|回复: 3

[已解决]python 序列

[复制链接]
发表于 2023-4-16 18:01:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
t=(1,2,3)
id(t)
2758798689088
t*2
(1, 2, 3, 1, 2, 3)
id(t)
2758798689088
t=(1,2,3)
id(t)
2758793408128
t*=2
t
(1, 2, 3, 1, 2, 3)
id(t)
2758791869248
请教大神,这里为啥t*2输出的id值和t的id值一样,而t*=2输入的id值和t的id值不一样呢?
最佳答案
2023-4-16 18:02:45
本帖最后由 歌者文明清理员 于 2023-4-16 18:04 编辑

在Python中,元组(tuple)是不可变的对象,这意味着一旦创建,元组的内部元素和其长度就不能改变。在你对元组进行乘法操作时,将会创建一个新的元组对象包含多个原始元组对象的引用。

因为在对元组执行乘法操作时,创建了一个新的元组对象,所以该对象的ID与原始的元组对象的ID不同。因此,当您使用 t * 2 对元组进行乘法操作时,它会创建一个新的元组并返回该元组,并且这个新元组具有一个不同于原始元组的唯一标识符。

而在使用 t *= 2 进行乘法赋值操作时,则是修改原始元组对象,将其扩展为一个由原来的元素重复两次的新元组对象。因此,在这种情况下,元组对象的ID与之前相同,但是其内部内容已经被改变。

以下是示例代码来演示这些概念:
t = (1, 2, 3)
id(t)  # 返回元组对象t的ID

t *= 2
print(t)  # 返回新创建的包含重复元素的元组对象
id(t)  # 返回扩展后的元组对象t的新ID

t = (1, 2, 3)
id(t)  # 返回元组对象t的初始ID

t = t * 2
print(t)  # 返回新创建的包含重复元素的元组对象
id(t)  # 返回新创建的包含重复元素的元组对象的唯一ID
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-16 18:02:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-4-16 18:04 编辑

在Python中,元组(tuple)是不可变的对象,这意味着一旦创建,元组的内部元素和其长度就不能改变。在你对元组进行乘法操作时,将会创建一个新的元组对象包含多个原始元组对象的引用。

因为在对元组执行乘法操作时,创建了一个新的元组对象,所以该对象的ID与原始的元组对象的ID不同。因此,当您使用 t * 2 对元组进行乘法操作时,它会创建一个新的元组并返回该元组,并且这个新元组具有一个不同于原始元组的唯一标识符。

而在使用 t *= 2 进行乘法赋值操作时,则是修改原始元组对象,将其扩展为一个由原来的元素重复两次的新元组对象。因此,在这种情况下,元组对象的ID与之前相同,但是其内部内容已经被改变。

以下是示例代码来演示这些概念:
t = (1, 2, 3)
id(t)  # 返回元组对象t的ID

t *= 2
print(t)  # 返回新创建的包含重复元素的元组对象
id(t)  # 返回扩展后的元组对象t的新ID

t = (1, 2, 3)
id(t)  # 返回元组对象t的初始ID

t = t * 2
print(t)  # 返回新创建的包含重复元素的元组对象
id(t)  # 返回新创建的包含重复元素的元组对象的唯一ID
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 18:04:24 | 显示全部楼层
这个问题涉及到 Python 的内存分配和不可变对象(如元组)的处理方式。当你对一个元组(tuple)执行乘法操作时,会创建一个新的元组,而不是修改原来的元组。这是因为元组是不可变的。

在你的例子中:

  • t = (1, 2, 3) 创建了一个新的元组,id 为 2758798689088。
  • t * 2 会创建一个新的元组,内容为 (1, 2, 3, 1, 2, 3)。但是,这个操作并不会改变 t。当你执行 id(t) 时,它仍然是原来的元组,所以 id 值没有改变。
  • 当你再次执行 t = (1, 2, 3) 时,Python 可能会为新的元组分配一个新的内存地址,所以 id 值变为 2758793408128。
  • t *= 2 是一个原地操作(in-place operation),它会改变 t 本身。虽然元组是不可变的,但你可以将一个新的元组赋值给变量 t。所以 t *= 2 的效果相当于 t = t * 2,它创建了一个新的元组,并将新的元组赋值给 t。因此,id(t) 的值变为 2758791869248。


总之,t * 2 不会改变 t 本身,而 t *= 2 会创建一个新的元组并将其赋值给 t。所以它们在内存中的 id 值不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 22:25:22 | 显示全部楼层

评分

参与人数 2鱼币 0 收起 理由
sfqxx + 2 他扣我补,略略略
歌者文明清理员 -2 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 17:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表