2016-11-11 42 views
0

我想知道,如果有人能在Python 解释,同时按以下方式初始化和Python中的评估矩阵

rows,cols = 3,3 
visited = [[False]*rows]*cols 
visited[0][0] = True 
print visited 
[[True, False, False], [True, False, False], [True, False, False]] 

至于并列于

visited = [] 
for i in range(rows): 
    visited.append([False]*cols) 
visited[0][0] = True 
print visited 
[[True, False, False], [False, False, False], [False, False, False]] 

我在蟒蛇初始化矩阵这一行为不确定,为什么在第一种情况下,第一列的所有元素都被初始化为true。

回答

2

奥斯瓦尔德拍摄了美国第35任总统,然后某某约翰菲茨杰拉德肯尼迪去世。为什么?因为他们是同一个人。

[[False]*rows]*cols将首先构造一个数组[False, False, False] - 让我们叫它约翰 - 然后构造另一个有三个约翰的数组。不是三份约翰 - 约翰的三个引用。

的相同原理的简单演示:

a = [False] 
b = a 
a[0] = True 
b[0] 
# => True 

b[False]不仅仅是a副本的[True]:只有一个[True],有两个人的名字为它(ab) 。

的差异可以很容易地在该可视化可以看出(点击 “向前”,以单步执行程序):

  • Three Johns

    john = [False] * 3 
    three_johns = [] 
    for i in range(3): 
        three_johns.append(john) 
    three_johns[1][1] = True 
    
  • Three random guys

    three_random_guys = [] 
    for i in range(3): 
        random_guy = [False] * 3 
        three_random_guys.append(random_guy) 
    three_random_guys[1][1] = True 
    

因此,正确初始化2D矩阵的最简单方法是:

[[False] * rows for _ in range(cols)]