2012-07-05 106 views
1
matrix = [[0]*1005]*1005 

这两种初始化数组的方式有什么区别?

matrix = [[0 for _ in range(1005)] for _ in range(1005)] 

我发现如果我使用前初始阵列,并运行matrix[1][1] = 1它将每一行中的第二列设置为1,当我希望执行第二。我无法弄清楚为什么?

+0

可能重复(http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default -argument) –

+0

糟糕。这不是我想要选择的问题。 –

回答

8

[[0] * 1005] * 1005将创建1005个个引用的数组到1005个零的数组。他们都是一样的参考,所以改变一个会改变所有其他人。您可以缩短你的工作代码这一点,虽然:

matrix = [[0] * 1005 for _ in range(1005)] 

这几乎是唯一的警告任何人曾经为您介绍有关名单乘法语法,其实:)

+0

你能给我一个关于python参考的链接吗?其实,它对'[0] * 1005'意味着什么。谢谢。 –

+1

@ user674199:http://docs.python.org/library/stdtypes.html#typesseq。见s * n:“n个连续的浅拷贝”。 – Ryan

+0

由于整数是不可变的,因此'[0] * 1005'可以。 –

3

只是对什么已经扩大被所述

a = [[0]] * 5 
print a # [[0], [0], [0], [0], [0]] 
a[0][0] = 1 
print a # [[1], [1], [1], [1], [1]] 
[在Python“最小惊讶”:易变默认参数]的
相关问题