2011-03-29 68 views
0

所有,如何正确使用b = [[1] * 3] * 3?

代码:

#=A=================== 
>>> b = [[1]*3]*3 
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0     
>>> b 
[[0, 1, 1], [0, 1, 1], [0, 1, 1]] 
>>> 
#=B=================== 
>>> b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0 
>>> b 
[[0, 1, 1], [1, 1, 1], [1, 1, 1]] 
  1. 我可以使用格式可能看起来像“B = [[1] * 3 * 3”,以获得相同的行为“b = [[1,1,1],[1,1,1],[1,1,1]]”减少键入?

  2. as “b = [[1] * 3] * 3”可能会返回一个“参考”的列表,对日常工作有用吗?任何样品?

谢谢! KC

+0

列表我不想听起来刺耳,但你的问题让我很头疼:D请你重新说明一下吗? – Spyros 2011-03-29 01:32:08

+0

这两个表达式完成不同的事情。显然,你不能像你的例子那样使用'b = [[1] * 3] * 3'。既然你已经给出了一个很好的证明它不起作用,你的问题是什么? – 2011-03-29 01:32:24

+0

@ S.Lott,这个问题来自web上的阅读帖子,当我阅读代码“b = [[1] * 3] * 3”时,我认为这个表达式清晰直接,可以减少键入,但我是肯定它不能工作,是的,我知道它是一个“参考”列表,所以我认为有可能对它进行细化并且与“b = [[1,1,1],[1,1, 1],[1,1,1]]“以减少输入类型,并且由于”b = [[1] * 3] * 3“可能导致作为”参考“列表,对日常工作有用吗? – user478514 2011-03-29 05:16:12

回答

1

与您的代码的问题是,它引用相同的列表,所以当你b[0][0] = 0,你真的更新在引用(在所有三个阵列指向)的值。

为了得到想要的结果,我会(使用list comprehension)做:

>>> b = [[1]*3 for _ in range(3)] 
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0 
>>> b 
[[0, 1, 1], [1, 1, 1], [1, 1, 1]] 

实际上再现列表,以便它引用不同的列表,而不是同一个在你的答案。

b = [[1]*3 for _ in range(3)]等同于:

b = [] 
for _ in range(3): 
    b.append([1]*3) 
1

你可以用一个列表理解,而不是建立您的清单:

b = [[1]*3 for _ in range(3)] 
1

您的问题是[[1, 1, 1]] * 3创建的三个引用列表,以相同[1, 1, 1]列表。做你想做什么,你要创建的副本[1,1,1]采用list()或使用切片表示法:

first_list = [1, 1, 1] 
second_list = [first_list[:], first_list[:], first_list[:]] 

second_list = [list(first_list), list(first_list), list(first_list)] 

要做到以上在同一行,你可以这样做:

second_list = [[1] * 3 for i in range(3)] 
0

在A节: 你有3个项目,但所有项目指向一个对象的列表:

[1] * 3

这样的:

a = [1,1,1] 
b = [a,a,a] 

但在部分B,你有不同的项目

相关问题