python 引用如何在列表中工作

约翰·多伊

我正在阅读这篇文章如何初始化二维数组

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

但在以下情况下:

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_a,你有0,和1,等等。

另一个问题是关于嵌套列表的。您有多个对单个列表对象的引用:

# indices in a list on the left referencing another list

0+---------------------------+
                             |
                             |
1+------------------------+  |
                          |  |
                +---------v--v-----------+
2+--------------> list with more indices |
                +---------^--^-----------+
                          |  |
3+------------------------+  |
                             |
                             |
4+---------------------------+

如果您对list with more indices内容进行了更改,那么您将通过外部列表中的 5 个引用中的任何一个看到这些更改

请阅读Ned Batchelder关于 Python 名称和值事实和神话,其中更详细地解释了这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章