Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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[0]*n语法仅适用于不可变对象? a=[[0]*3]*4 打印(a[0]是[1])#正确_Python_List - Fatal编程技术网

Python[0]*n语法仅适用于不可变对象? a=[[0]*3]*4 打印(a[0]是[1])#正确

Python[0]*n语法仅适用于不可变对象? a=[[0]*3]*4 打印(a[0]是[1])#正确,python,list,Python,List,当我以这种方式初始化二维数组时,出现了问题。 我花了一点时间才发现这种意想不到的行为。那么,这种语法只适用于不可变对象吗 出什么事了“错了”? 它确实是一个二维列表。(我不知道这是否是一件事,但我的意思是,它以一种可以将其转换为二维数组的形式生成列表)。 要将其转换为正确的数组,必须使用 import numpy as np a = [[0]*3] * 4 a = np.array(a) 您可以通过将其转换为元组使其不可变。在您的示例中,它也以其方式“起作用”。这就是list.\uu mul\

当我以这种方式初始化二维数组时,出现了问题。 我花了一点时间才发现这种意想不到的行为。那么,这种语法只适用于不可变对象吗

出什么事了
“错了”
? 它确实是一个二维列表。(我不知道这是否是一件事,但我的意思是,它以一种可以将其转换为二维数组的形式生成列表)。 要将其转换为正确的数组,必须使用

import numpy as np
a = [[0]*3] * 4
a = np.array(a)
您可以通过将其转换为元组使其不可变。

在您的示例中,它也以其方式“起作用”。这就是
list.\uu mul\uu
的实现如何解释您想要的内容。列表不能构造新对象,它不知道如何从它碰巧包含的任何对象创建新对象。它通过对这些对象的新引用来扩展自身

对于不可变的整数,您会得到相同的行为

>>> x = [0] * 3
>>> x[0] is x[1]
True
您可以使用

>>> a = [[0]*3 for _ in range(4)]
>>> a[0] is a[1]
False

[0]*3
之所以能满足您的需求,是因为它正在创建一个列表,其中包含对同一个不可变的
0

的3个引用。它通过引用复制列表元素,而不是对可变对象的深度复制。对于Python初学者来说,这种行为至少是意外的(虽然这个表达式不能复制任意对象是合乎逻辑的,因此也不会尝试复制。)也请尝试一下,
a[0][1]=1
print(a)
注意,所有元素中的中心元素都已更新。您可能想查看我认为这是一个很好的答案。
numpy
是制作数组的一种方法,但也有其他方法,包括常规嵌套python列表。如果您想单独引用数组的单元格,numpy可能不是最佳选择,因为有必要ds是这些单元格的python转换。@tdelaney你完全正确,但我不明白问题是什么,因为他刚才说事情出了问题。这种语法确实有效,所以无论是列表还是元组都没有语法错误。我无法通过注释来澄清这一点,因此我想写这个答案。在ori中基纳尔问题,在创建数组之后,如果OP做了
a[0][0]=42
,他会发现42现在在所有行中:
[[42,0,0],[42,0,0],[42,0,0],[42,0,0]]
,因为外部列表有4个对单个内部列表的引用,而不是4个内部列表。@tdelaney我实际上没有看到这一点。但是为什么需要“python转换”来引用numpy数组中的单元格。这是因为numpy数组包含特定数据类型的元素吗?python对象相当庞大。整数大约是44字节(我记不清了)。您需要创建对象,修改其引用计数,然后将指向该对象的指针存储在容器中。在numpy中,整数数组只是保存这些整数的内存块。numpy函数直接使用整数,但python操作需要获取整数,创建python int,然后使用它。最好避免使用python尽可能在numpy中设置级别引用。