Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试修改单个值时,“二维列表”的行为异常_Python_Python 2.7_List_2d - Fatal编程技术网

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