为什么要获取一个列表的一部分,而该列表分配给另一个列表而不更改原始列表?

问题描述 投票:0回答:1

我有一个表示数学张量的类。类中的张量存储为单个列表,而不是另一个列表中的列表。这意味着[[1, 2, 3], [4, 5, 6]]将存储为[1, 2, 3, 4, 5, 6]

我制作了一个__setitem__()函数和一个用于处理张量为单列表格式的张量的函数。例如,对于上述列表,slice(1, None, None)将变为slice(3, None, None)。但是,当我为该切片分配新值时,原始张量不会更新。

这是简化代码的样子

class Tensor:
    def __init__(self, tensor):
        self.tensor = tensor # Here I would flatten it, but for now imagine it's already flattened.

    def __setitem__(self, slices, value):
        slices = [slices] 
        temp_tensor = self.tensor # any changes to temp_tensor should also change self.tensor.

        for s in slices: # Here I would call self.slices_to_index(), but this is to keep the code simple.
            temp_tensor = temp_tensor[slice]

        temp_tensor = value # In my mind, this should have also changed self.tensor, but it hasn't.

也许我只是愚蠢,无法理解为什么这不起作用。也许我真正的问题不只是“为什么这样不起作用?”而且“还有更好的方法吗?”。谢谢您能给我的帮助。

注意:

列表的每个“维”必须具有相同的形状,因此不允许[[1, 2, 3], [4, 5]]

此代码已大大简化,因为还有许多其他帮助器功能和类似的东西。

__init__()中,我将把列表弄平,但正如我刚才所说的,为了简化起见,我将其与self.slice_to_index()一起忽略了。

python-3.x list slice mutable
1个回答
0
投票

您不应该将Python变量视为c++java中的变量。将它们视为放置在值上的标签。检查此示例:

>>> l = []
>>> l.append
<built-in method append of list object at 0x7fbb0d40cf88>
>>> l.append(10)
>>> l
[10]
>>> ll = l
>>> ll.append(10)
>>> l
[10, 10]
>>> ll
[10, 10]
>>> ll = ["foo"]
>>> l
[10, 10]

如您所见,ll变量首先指向相同的l列表,但之后我们仅使其指向另一个列表。修改后面的ll不会修改l指向的原始列表。

© www.soinside.com 2019 - 2024. All rights reserved.