我正在阅读这篇文章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?
而改变答案 0 :(得分:4)
你误解了。有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的Facts and myths about Python names and values,更详细地解释了这一点。
答案 1 :(得分:0)