2017-08-11 117 views
-3

工作,我正在读这篇文章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?

回答

4

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

这里没有更改嵌套列表。您更改了其中一个参考。

将引用看作nametags。您可以在对象上放置多个名牌:

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

您可以通过任一引用“查看”对象。赋值只是将一个引用附加到一个对象上。如果引用指向一个对象之前,它是从物体分离,现在指向另一个对象:

​​

结果

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,这更详细地解释了这一点。

+0

呢'[X] * 5'创建一个包含'x'的值列表中的新对象,这就是为什么是这样的? – KGS

+1

@KGS:是的,乘以一个列表将创建一个新的列表对象,其中复制从旧列表中引用的所有引用。所以你有一个带有1个引用的列表,现在你有一个带有5个引用的新列表。 “x”引用的对象不会被复制,您只需获得更多引用。 –