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
引用的对象不会被复制,您只会得到更多引用。