大大大大力无限 发表于 2023-4-16 18:01:55

python 序列

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

isdkz 发表于 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 值不同。

lizr 发表于 2023-4-16 22:25:22

{:5_105:}
页: [1]
查看完整版本: python 序列