Skip to main content
 首页 » 编程设计

python之为什么要用for循环构造多维数组

2025年05月04日10jyk

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 

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

请您参考如下方法:

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

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

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

在上面的例子中,列表有三个元素,它们都指向同一个对象(这是使用 id 内置函数检查的)。但是,当第一个元素被修改时,该元素现在指向另一个不同的对象,并且更改不会影响列表中的其他元素。

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

>>> l = [[0]] * 3 
>>> l 
[[0], [0], [0]] 
>>> map(id, l) 
[48544944, 48544944, 48544944] 
>>> l[0].append(0) 
>>> l 
[[0, 0], [0, 0], [0, 0]] 
>>> map(id, l) 
[48544944, 48544944, 48544944] 

请注意,在此示例中,在调用 append 方法后,并没有像上一个示例那样创建新对象。假设列表中的所有元素仍然指向同一个对象(id 内置函数为所有这些元素返回相同的值),则为列表中的所有元素显示对象的新状态.

因此,回答你的问题,因为你可能不想要这种行为,你需要在嵌套循环中创建你需要的列表,以确保列表中的所有元素都指向一个你可以修改的不同对象不会改变列表中其他元素的状态作为副作用。