2013-09-22 127 views
0

我不知道这是否是一个错误,或者我在阵列中的*记号的错误语义:初始化矩阵python3

>>> arr = [None] * 5 # Initialize array of 5 'None' items 
>>> arr 
[None, None, None, None, None] 
>>> arr[2] = "banana" 
>>> arr 
[None, None, 'banana', None, None] 
>>> # right? 
... 
>>> mx = [ [None] * 3 ] * 2  # initialize a 3x2 matrix with 'None' items 
>>> mx 
[[None, None, None], [None, None, None]] 
>>> # so far, so good, but then: 
... 
>>> mx[0][0] = "banana" 
>>> mx 
[['banana', None, None], ['banana', None, None]] 
>>> # Huh? 

这是一个错误,还是我找错了语义__mult__令牌的含义?

回答

1

您正在多次将相同的参考复制到列表中。像这样做:

matrix = [[None]*3 for i in range(2)]

+0

所以,那有什么确切的'*'令牌的含义是什么?如果它复制了一个对象的引用,那么我应该期望在第一部分传递'arr [2] =“banana”'时,该列表应该是'['banana','banana','banana ','香蕉','香蕉']'而不是上面那个。 – user2804578

+0

哦,刚碰到答案[StackOverflow其他地方](http://stackoverflow.com/questions/9658459/initializing-matrix-in-python-using-0xy-creates-linked-rows/9658522#9658522)但是,我发现奇怪的是'*'标记在列表上的含义与其他基本数据类型不同 – user2804578

+0

它确实具有相同的含义。对于不可变类型来说,像“复制”这样的东西总是会创建一个赋予相同值的新对象,而可变对象只是复制其引用。这里有一些更好的阅读,它是什么意思,类型是不可变的。 http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types-python – Ben