python引用如何在列表中工作

时间:2017-08-11 06:47:59

标签: python arrays multiplication

我正在阅读这篇文章How to Initialize a 2d Array

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

但在例如:

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

不应该因为每个元素引用x?

而改变

2 个答案:

答案 0 :(得分:4)

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

您没有在此处更改嵌套列表。您更改了其中一个参考文献。

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

nametag_a+-----------+
                 +---v--+
                 |object|
                 +---^--+
                     |
nametag_b+-----------+

您可以通过参考“查看”对象。赋值只是附加对象的引用。如果引用之前指向了一个对象,它将与该对象分离,现在指向另一个对象:

nametab_b = another_object

结果

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

nametag_b    +--------------+
    +-------->another_object|
             +--------------+

列表中的编号索引是对;所以不是nametag_a,而是01等。

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

# 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的Facts and myths about Python names and values,更详细地解释了这一点。

答案 1 :(得分:0)

进一步了解情况的好网站。

Python Tutor

enter image description here