Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/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_List - Fatal编程技术网

Python 在列表中循环

Python 在列表中循环,python,list,Python,List,我是编程新手,我有一个我无法解决的基本问题。我尽量简化它。在这个简化的版本中,我遍历一个空列表。我只想将索引存储在“对称矩阵”中: 最初,列表如下所示: [[None, None], [None, None]] 在循环槽之后,我希望打印输出为: [[[0, 0], None], [None, None]] [[[0, 0], [0, 1]], [None, None]] [[[1, 0], [0, 1]], [[1, 0], None]] [[[1, 0], [1, 1]], [[1, 0]

我是编程新手,我有一个我无法解决的基本问题。我尽量简化它。在这个简化的版本中,我遍历一个空列表。我只想将索引存储在“对称矩阵”中:

最初,列表如下所示:

[[None, None], [None, None]] 
在循环槽之后,我希望打印输出为:

[[[0, 0], None], [None, None]]
[[[0, 0], [0, 1]], [None, None]]
[[[1, 0], [0, 1]], [[1, 0], None]]
[[[1, 0], [1, 1]], [[1, 0], [1, 1]]]
相反,我得到的是:

[[[0, 0], None], [[0, 0], None]]
[[[0, 0], [0, 1]], [[0, 0], [0, 1]]]
[[[1, 0], [0, 1]], [[1, 0], [0, 1]]]
[[[1, 0], [1, 1]], [[1, 0], [1, 1]]]

我错过了什么?感谢您的帮助…

您的初始化将创建对同一列表的两个引用:

n=2
B=[[None]*n]*n
for x in B:
     print id(x)
输出:

4534759576
4534759576

您需要的不是当前定义
B
的方式,而是
n
子列表的“新”实例:

B = [[None] * n for _ in range(n)]
这相当于但较短,且(对于蟒蛇)比:

B = []
for _ in range(n):
    B.append([None] * n)
这是因为Python中的列表不是值而是对象;i、 e.默认情况下不会复制它们。例如:

>>> a = []
>>> b = [a, a]  # list of 2 items, both pointing to the same list instance
>>> b[0].append(1)  # b[0] refers to the same list instance also referenced by a
>>> print b
[[1], [1]]
鉴于:

>>> b = [[], []]  # list of 2 distinct sublists
>>> b[0].append(1)
>>> print b
[[1], []]
如果你把这些知识应用到

B = [[None] * n] * n
您将看到在创建包含另一个
n
None
值列表的列表时的构造中出现错误;然后将列表“升迁”,以包含此类列表的
n
;但是,将使用相同的列表实例,就像上面更简单的示例一样


p.S.更准确地说,Python中的所有内容都是对象而不是值,除非对象是不可变的,例如
int
S和
float
S和
str
S等,这就好像它们是值并且总是被复制,这是因为如果对象是不可变的,您不妨将它的新引用假装为它的新副本,因为它看起来相同,无法修改。

以下是您可以做的事情,您需要做的是:

    n=2
    B = [[None for i in range(n)] for i in range(n)]
    print B, "\n"
    for i in range(n):
        for j in range(n):
        B[i][j] = [i, j]
        print B

理解这里发生的事情的关键是理解当您使用
[[None]*n]*n
方法时,您正在创建具有共享引用的列表。看看你的代码是做什么的,它会让事情变得更清楚。还解释了名称和值在Python中的工作方式。

Dup:可能是重复的,恐怕还有更多。非常有用的链接-thanx。
    n=2
    B = [[None for i in range(n)] for i in range(n)]
    print B, "\n"
    for i in range(n):
        for j in range(n):
        B[i][j] = [i, j]
        print B