gpt4 book ai didi

python - tuple() 是否复制参数的元素?

转载 作者:行者123 更新时间:2023-11-28 21:21:24 25 4
gpt4 key购买 nike

在 python 中,内置函数 tuple([iterable]) 是创建一个元组对象并用“iterable”元素的副本填充它,还是创建一个包含引用的元组到已经存在的“可迭代”对象?

最佳答案

tuple 将迭代序列并复制值。底层序列将存储以实际保留值,但元组表示将替换它。所以是的,转换为元组是实际工作,而不仅仅是另一种类型的嵌套。

您可以在转换生成器时看到这种情况:

>>> def gen ():
for i in range(5):
print(i)
yield i
>>> g = gen()
>>> g
<generator object gen at 0x00000000030A9B88>
>>> tuple(g)
0
1
2
3
4
(0, 1, 2, 3, 4)

如您所见,生成器立即迭代,生成值。之后,元组是自包含的,不保留对原始来源的引用。作为引用,list() 的行为方式完全相同,但它创建的是一个列表。

275365 指出的行为(在现已删除的答案中)是 Python 值的标准复制行为。因为 Python 中的一切都是对象,所以您基本上只使用引用。因此,当复制引用时,不会复制底层对象。重要的一点是,只要它们的值发生变化,就会重新创建不可变对象(immutable对象),这不会更新所有以前存在的引用,而只会更新您当前正在更改的一个引用。这就是为什么它是这样工作的:

>>> source = [[1], [2], [3]]
>>> tpl = tuple(source)
>>> tpl
([1], [2], [3])
>>> tpl[0].append(4)
>>> tpl
([1, 4], [2], [3])
>>> source
[[1, 4], [2], [3]]

tpl 仍然包含对 source 列表中原始对象的引用。由于这些是列表,因此它们是可变的。在任何地方更改可变列表都不会使对该列表的引用无效,因此更改将出现在 sourcetpl 中。然而,实际的源列表只存储在 source 中,而 tpl 没有引用它:

>>> source.append(5)
>>> source
[[1, 4], [2], [3], 5]
>>> tpl
([1, 4], [2], [3])

关于python - tuple() 是否复制参数的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com