在python中,内置函数是tuple([iterable])创建一个元组对象并用“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)
Run Code Online (Sandbox Code Playgroud)
如您所见,生成器立即迭代,生成值。之后,元组是自包含的,不会保留对原始来源的引用。作为参考,list()其行为方式完全相同,但会创建一个列表。
275365 指出的行为(在现已删除的答案中)是 Python 值的标准复制行为。因为 Python 中的一切都是对象,所以您基本上只使用引用。所以当引用被复制时,底层对象不会被复制。重要的一点是,非可变对象将在其值发生更改时重新创建,这不会更新所有先前存在的引用,而只会更新您当前正在更改的引用。这就是为什么它是这样工作的:
>>> 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]]
Run Code Online (Sandbox Code Playgroud)
tpl仍然包含对source列表中原始对象的引用。由于这些是列表,因此它们是可变的。在任何地方更改可变列表不会使对该列表的引用无效,因此更改将同时出现在source和 中tpl。然而,实际的源列表仅存储在 中source,并tpl没有引用它:
>>> source.append(5)
>>> source
[[1, 4], [2], [3], 5]
>>> tpl
([1, 4], [2], [3])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |