Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中奇怪的二维列表行为_Python_List - Fatal编程技术网

python中奇怪的二维列表行为

python中奇怪的二维列表行为,python,list,Python,List,python为什么要做以下事情 >>> bla = [[]] * 5 >>> bla[3].append("blub") >>> print bla [['blub'], ['blub'], ['blub'], ['blub'], ['blub']] 我希望 [[], [], [], ['blub'], []] 您将原始列表的内容乘以五倍-内部列表只是一个引用,因此相同的引用被乘以五倍 换句话说,您得到的最终列表是一个多次包含同一列表的列

python为什么要做以下事情

>>> bla = [[]] * 5
>>> bla[3].append("blub")
>>> print bla
[['blub'], ['blub'], ['blub'], ['blub'], ['blub']]
我希望

[[], [], [], ['blub'], []]

您将原始列表的内容乘以五倍-内部列表只是一个引用,因此相同的引用被乘以五倍

换句话说,您得到的最终列表是一个多次包含同一列表的列表

对于Python 2,解决此问题的简单方法是:

[[] for i in xrange(5)]
Python 3:

[[] for i in range(5)]

这是Python常见的混淆点,与隐式的按引用传递有关。你打字的时候

x = []
将名称
x
绑定到内存中的空列表。当你这样做的时候

x = [[]] * 5
它将名称
x
绑定到一个包含五个内容的列表,每个内容都是对同一个空列表的引用。如果你这样想,这可能会更清楚:

>>> y = []
>>> x = [y]*5
>>> x
[[], [], [], [], []]
>>> x[0].append(0)
>>> x
[[0], [0], [0], [0], [0]]
>>> y
[0]
也就是说,即使
[]
没有绑定任何变量名,它仍然会创建一个对空列表的引用,然后复制五次

如果您不想这样做,您需要显式地构造五个空列表来存储在
x
中。有多种方法可以做到这一点(
copy.deepcopy
是一种通用的解决方案),但我认为最简单的方法是:

x = [[] for _ in range(5)]
或者,
numpy
是一个扩展模块,它提供了一个非常强大的多维数组。

\u
(over
i
)是推荐的,因为它表示“我实际上没有使用它”(而
i
通常用作索引)。