2024-04-25 13:09:04 发布
网友
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\u set\u 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]
在上面的示例中,列表有三个元素,它们都指向同一个对象(这是使用^{}内置项检查的)。但是,当修改第一个元素时,该元素现在指向另一个不同的对象,并且更改不会影响列表中的其他元素。你知道吗
另一方面,如果对象是可变的,则当使用方法就地修改对象时,得到的结果就像修改应用于列表中的所有对象一样:
>>> 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内置函数返回相同的值),那么将为列表中的所有元素显示对象的新状态。你知道吗
append
id
因此,回答您的问题时,由于您可能不希望出现这种行为,因此需要在嵌套循环中创建所需的列表,以确保列表中的所有元素都指向一个不同的对象,您可以修改该对象,而无需更改列表中其他元素的状态作为副作用。你知道吗
它创建对同一列表的rad引用。更改其中一个元素会更改所有元素,因为它们是同一个列表。你知道吗
rad
[[0 for x in range(rad)] for y in range(rad)]
在使用乘法运算符生成列表时,必须考虑所创建的对象是可变的还是不可变的。你知道吗
在python中,整数是不可变的,在算术运算之后,将创建一个新对象:
在上面的示例中,列表有三个元素,它们都指向同一个对象(这是使用^{} 内置项检查的)。但是,当修改第一个元素时,该元素现在指向另一个不同的对象,并且更改不会影响列表中的其他元素。你知道吗
另一方面,如果对象是可变的,则当使用方法就地修改对象时,得到的结果就像修改应用于列表中的所有对象一样:
注意,在本例中,在调用
append
方法之后,没有像上一个示例中那样创建新对象。假设列表中的所有元素仍然指向同一个对象(对于所有元素,id
内置函数返回相同的值),那么将为列表中的所有元素显示对象的新状态。你知道吗因此,回答您的问题时,由于您可能不希望出现这种行为,因此需要在嵌套循环中创建所需的列表,以确保列表中的所有元素都指向一个不同的对象,您可以修改该对象,而无需更改列表中其他元素的状态作为副作用。你知道吗
它创建对同一列表的
rad
引用。更改其中一个元素会更改所有元素,因为它们是同一个列表。你知道吗相关问题 更多 >
编程相关推荐