python嵌套列表索引_python – 嵌套列表索引

  • Post author:
  • Post category:python


这个问题是由python选择通过引用传递列表的事实引起的.

通常,变量按“值”传递,因此它们独立运行:

>>> a = 1

>>> b = a

>>> a = 2

>>> print b

1

但是,由于列表可能会相当大,而不是将整个列表移动到内存之外,Python选择使用引用(C语言中的“指针”).如果您将另一个变量分配给另一个变量,则只需为其分配引用.这意味着你可以有两个变量指向内存中的相同列表:

>>> a = [1]

>>> b = a

>>> a[0] = 2

>>> print b

[2]

所以,在你的第一行代码中你有4 * [0].现在[0]是指向内存中值0的指针,当你乘以它时,你会得到四个指针到内存中的相同位置.但是当您更改其中一个值时,Python知道指针需要更改以指向新值:

>>> a = 4 * [0]

>>> a

[0, 0, 0, 0]

>>> [id(v) for v in a]

[33302480, 33302480, 33302480, 33302480]

>>> a[0] = 1

>>> a

[1, 0, 0, 0]

当您将此列表乘以时,会出现问题 – 您将获得列表指针的四个副本.现在,当您更改一个列表中的一个值时,所有四个更改在一起:

>>> a[0][0] = 1

>>> a

[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

解决方案是避免第二次乘法.一个循环做这个工作:

>>> some_list = [(4 * [0]) for _ in range(4)]



版权声明:本文为weixin_30119251原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。