Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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 为什么使用pop填充列表会改变整个列表?_Python_List - Fatal编程技术网

Python 为什么使用pop填充列表会改变整个列表?

Python 为什么使用pop填充列表会改变整个列表?,python,list,Python,List,我有一个包含16个字符的列表。我想用这个列表用4个子列表填充一个新列表。以下是我得到的: alist = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', ' ', '1', '2'] list4x4 = [[None]*4]*4 for i in range(4): for j in range(4): list4x4[i][j] = alist.pop(0) print list4

我有一个包含16个字符的列表。我想用这个列表用4个子列表填充一个新列表。以下是我得到的:

alist = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', ' ', '1', '2']

list4x4 = [[None]*4]*4

for i in range(4):
    for j in range(4):
        list4x4[i][j] = alist.pop(0)

print list4x4
这给了我

[['!', ' ', '1', '2'], ['!', ' ', '1', '2'], ['!', ' ', '1', '2'], ['!', ' ', '1', '2']]
而我想要的结果是

[['H', 'e', 'l', 'l'], ['o', ',', ' ', 'w'], ['o', 'r', 'l', 'd'], ['!', ' ', '1', '2']]

有人能解释一下这是怎么回事吗?感谢您构建列表的方式,最终外部列表将填充对同一内部列表的引用。e、 g:

>>> l = [[None]*4]*4
>>> print [ id(x) for x in l ]
[39323552, 39323552, 39323552, 39323552]
所以你可以看到每个内部列表都有相同的ID——换句话说,它们都是相同的列表

尝试:


按照构建列表的方式,最终外部列表中填充了对同一内部列表的引用。e、 g:

>>> l = [[None]*4]*4
>>> print [ id(x) for x in l ]
[39323552, 39323552, 39323552, 39323552]
所以你可以看到每个内部列表都有相同的ID——换句话说,它们都是相同的列表

尝试:


您有4个对同一列表的引用,其中有4个对同一列表的引用。您有4个对同一列表的引用,其中有4个对同一列表的引用。@Wooble--No。对于内部列表来说这很好,因为
None
是不可变的(和一个单例)
[None,None,None,None]
[None]*4
是一回事。还要注意的是,如果你有一个列表
a=[None,None,None,None]
,你可以毫无问题地分配给该列表中的一个元素:
a[1]=3
@Wooble列表理解重新评估该语句,为每次迭代生成一个新的子列表。啊,我错误地认为
[None]*4
意味着
[None],[None],[None],[None],[None]
@Wooble--是的,我明白了--那将是一个问题:)@Wooble--不。内部列表没有问题,因为
None
是不可变的(并且是一个单态)。
[None,None,None,None]
[None]*4
是同一回事。还要注意,如果你有一个列表
a=[None,None,None,None,None,None]
,您可以毫无问题地分配给该列表中的元素:
a[1]=3
@Wooble列表理解重新评估该语句,为每次迭代生成一个新的子列表。啊,我错误地认为
[None]*4
意味着
[None],[None],[None]]
@Wooble——是的,我明白了——那将是个问题:)