我正在阅读这篇文章如何初始化二维数组
我知道这里的问题是列表引用了同一个列表。因此,如果您编辑其中一个元素。所有参考文献都将反映这一变化。
但在以下情况下:
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] 删除。
我来说两句