python引用如何在列表中工作

python引用如何在列表中工作,python,arrays,multiplication,Python,Arrays,Multiplication,我正在读这篇文章 我知道这里的问题是一个列表引用了同一个列表。因此,如果您编辑其中一个元素。所有参考资料都将反映这一变化 但在以下情况下: x = 1 y = [x]*5 # y = [1, 1, 1, 1, 1] x = 2 # why doesn't y = [2, 2, 2, 2, 2]?? y是否应该更改,因为每个元素都引用了x?您误解了。有5个不同的引用。如果这5个引用都指向同一个嵌套列表,并且您更改了该嵌套列表,则可以通过所有这些引用看到所反映的更改 您没有在此处更改嵌套列表。您

我正在读这篇文章

我知道这里的问题是一个列表引用了同一个列表。因此,如果您编辑其中一个元素。所有参考资料都将反映这一变化

但在以下情况下:

x = 1
y  = [x]*5
# y = [1, 1, 1, 1, 1]
x = 2
# why doesn't y = [2, 2, 2, 2, 2]??

y是否应该更改,因为每个元素都引用了x?

您误解了。有5个不同的引用。如果这5个引用都指向同一个嵌套列表,并且您更改了该嵌套列表,则可以通过所有这些引用看到所反映的更改

您没有在此处更改嵌套列表。您更改了其中一个引用

将引用视为名称标记。可以在对象上放置多个名称标记:

nametag_a+-----------+
                 +---v--+
                 |object|
                 +---^--+
                     |
nametag_b+-----------+
您可以通过任一引用“查看”对象。赋值只是将引用附加到对象。如果引用以前指向某个对象,则它将从该对象分离,现在指向另一个对象:

nametab_b = another_object
导致

nametag_a+-----------+
                 +---v--+
                 |object|
                 +------+

nametag_b    +--------------+
    +-------->another_object|
             +--------------+
列表中的编号索引是对的引用;因此,您没有使用
nametag\u a
,而是使用
0
1

另一个问题涉及嵌套列表。在这里,您对单个列表对象有多个引用:

# indices in a list on the left referencing another list

0+---------------------------+
                             |
                             |
1+------------------------+  |
                          |  |
                +---------v--v-----------+
2+--------------> list with more indices |
                +---------^--^-----------+
                          |  |
3+------------------------+  |
                             |
                             |
4+---------------------------+
如果您对包含更多索引的
列表进行更改,那么您将通过外部列表中的5个引用中的任何一个看到这些更改


请阅读Ned Batchelder的文章,其中详细解释了这一点。

有助于进一步了解情况的绝佳网站


是否创建了一个新的对象,该对象是包含
x
值的列表,这就是为什么它是这样工作的?@KGS:是的,与列表相乘将创建一个新的列表对象,其中包含复制的旧列表中的所有引用。因此,您有一个包含1个引用的列表,现在您有一个包含5个引用的新列表。
x
引用的对象不会被复制,您只会得到更多引用。