Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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 为什么多维数组要用for循环构造?_Python - Fatal编程技术网

Python 为什么多维数组要用for循环构造?

Python 为什么多维数组要用for循环构造?,python,Python,后一种实现(make_set_basic)有什么问题 它创建对同一列表的rad引用。更改其中一个元素会更改所有元素中的元素,因为它们是相同的列表 def make_set(rad): y = [] for i in range(0, rad): x = [] for j in range(0, rad): x.append(0) y.append(x) return y def make_set_b

后一种实现(make_set_basic)有什么问题

它创建对同一列表的
rad
引用。更改其中一个元素会更改所有元素中的元素,因为它们是相同的列表

def make_set(rad):
    y = []
    for i in range(0, rad):
        x = []
        for j in range(0, rad):
            x.append(0)
        y.append(x)
    return y

def make_set_basic(rad):
    z = [[0] * rad] * rad
    return z

它创建对同一列表的
rad
引用。更改其中一个元素会更改所有元素中的元素,因为它们是相同的列表

def make_set(rad):
    y = []
    for i in range(0, rad):
        x = []
        for j in range(0, rad):
            x.append(0)
        y.append(x)
    return y

def make_set_basic(rad):
    z = [[0] * rad] * rad
    return z

使用乘法运算符生成列表时,必须考虑要创建的对象是可变的还是不可变的

在python中,整数是不可变的,经过算术运算后,将创建一个新对象:

[[0 for x in range(rad)] for y in range(rad)]
在上面的示例中,列表有三个元素,它们都指向同一个对象(这是使用内置项检查的)。但是,当修改第一个元素时,该元素现在指向另一个不同的对象,并且更改不会影响列表中的其他元素

另一方面,如果对象是可变的,当您使用就地修改对象的方法时,您得到的结果就像修改应用于列表中的所有对象一样:

>>> l = [0] * 3
>>> l
[0, 0, 0]
>>> map(id, l)
[42383312, 42383312, 42383312]
>>> l[0] += 1
>>> l
[1, 0, 0]
>>> map(id, l)
[42383288, 42383312, 42383312]
请注意,在本例中,在调用
append
方法后,没有像前面的示例中那样创建新对象。假设列表中的所有元素仍然指向同一对象(内置的
id
为所有元素返回相同的值),则列表中的所有元素都将显示对象的新状态


因此,回答您的问题,因为您可能不希望出现这种行为,您需要创建嵌套循环中所需的列表,以确保列表中的所有元素都指向不同的对象,您可以修改该对象,而无需更改列表中其他元素的状态作为副作用。

使用乘法运算符创建列表时,您必须考虑所创建的对象是可变的还是不可变的

在python中,整数是不可变的,经过算术运算后,将创建一个新对象:

[[0 for x in range(rad)] for y in range(rad)]
在上面的示例中,列表有三个元素,它们都指向同一个对象(这是使用内置项检查的)。但是,当修改第一个元素时,该元素现在指向另一个不同的对象,并且更改不会影响列表中的其他元素

另一方面,如果对象是可变的,当您使用就地修改对象的方法时,您得到的结果就像修改应用于列表中的所有对象一样:

>>> l = [0] * 3
>>> l
[0, 0, 0]
>>> map(id, l)
[42383312, 42383312, 42383312]
>>> l[0] += 1
>>> l
[1, 0, 0]
>>> map(id, l)
[42383288, 42383312, 42383312]
请注意,在本例中,在调用
append
方法后,没有像前面的示例中那样创建新对象。假设列表中的所有元素仍然指向同一对象(内置的
id
为所有元素返回相同的值),则列表中的所有元素都将显示对象的新状态


因此,回答您的问题,因为您可能不希望出现这种行为,您需要在嵌套循环中创建所需的列表,以确保列表中的所有元素都指向不同的对象,您可以修改该对象,而无需更改列表中其他元素的状态作为副作用。

您实际上只需要一个
用于
此处:
[[0]*rad用于范围内(rad)]
仅因为
0
是不可变的。但明确无误。实际上,对于
只需要一个
,这里:
[[0]*rad表示范围内(rad)]
,因为
0
是不可变的。但直言不讳从来都没有坏处。