Python 尝试修改单个值时,“二维列表”的行为异常
可能重复:Python 尝试修改单个值时,“二维列表”的行为异常,python,python-2.7,list,2d,Python,Python 2.7,List,2d,可能重复: 因此,我对Python比较陌生,在处理2D列表时遇到困难 这是我的密码: data = [[None]*5]*5 data[0][0] = 'Cell A1' print data 以下是输出(格式化为可读性): 为什么每一行都会被赋值?这将生成一个列表,其中包含对相同的列表的五个引用: data = [[None]*5]*5 使用类似的方法创建五个单独的列表: >>> data = [[None]*5 for _ in range(5)] 现在它实现了您所
因此,我对Python比较陌生,在处理2D列表时遇到困难 这是我的密码:
data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
以下是输出(格式化为可读性):
为什么每一行都会被赋值?这将生成一个列表,其中包含对相同的列表的五个引用:
data = [[None]*5]*5
使用类似的方法创建五个单独的列表:
>>> data = [[None]*5 for _ in range(5)]
现在它实现了您所期望的:
>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
在python中,每个变量都是一个对象,因此也是一个引用。您首先创建了一个包含5个none的数组,然后使用5倍于相同对象的值构建了一个数组 还要注意的是,副本很浅;嵌套结构不会被复制。这经常困扰着新的Python程序员;考虑: 实际情况是[[]]是一个包含一个空列表的单元素列表,因此[[]]*3的所有三个元素都是(指向)这个空列表。修改列表的任何元素都会修改此单个列表 您可以通过以下方式创建不同列表的列表:
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
哦,天哪,我以前也遇到过同样的问题吗……)
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]