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
Run Code Online (Sandbox Code Playgroud)
后一个实现(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]
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,列表包含三个元素,所有元素都指向同一个对象(使用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]
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,在callin append方法之后,没有像上一个示例中那样创建新对象.假定列表中的所有元素仍然指向同一个对象(id内置函数为所有元素返回相同的值),则会为列表中的所有元素显示对象的新状态.
因此,回答您的问题,因为您可能不想要这种行为,您需要在嵌套循环中创建所需的列表,以确保列表中的所有元素指向您可以修改的不同对象,而无需更改列表中其他元素的状态作为副作用.
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |