Python 3.x 初始化矩阵python3

Python 3.x 初始化矩阵python3,python-3.x,matrix,initialization,Python 3.x,Matrix,Initialization,我不知道这是一个bug,还是数组中*标记的语义有误: >>> 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?

我不知道这是一个bug,还是数组中*标记的语义有误:

>>> 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?

这是一个bug,还是我对
\uuu mult\uuu
标记的语义理解错误?

您多次将同一引用复制到列表中。这样做:


matrix=[[None]*3表示范围(2)]

那么
*
标记的确切含义是什么?如果它确实复制了一个对象的引用,那么在第一部分,当传递
arr[2]=“banana”
时,列表应该是
['banana','banana','banana','banana','banana','banana']
,而不是上面的那一个。哦,只是碰到了答案,我觉得很奇怪,
*
标记在列表中没有与其他基本数据类型相同的含义,实际上具有相同的含义。只是对于不可变类型,像“复制”这样的操作总是使一个新对象被赋予相同的值,而可变对象只是复制了它们的引用。这里有一些关于类型不可变意味着什么的更好的阅读。