使用乘法创建列表但不是每个列表镜像
Create a list utilizing multiplication but not have each list mirror
小问题,希望大家帮忙:
这是我的代码:
def nd_mkboard(dims, filler):
n = len(dims)
helpboard = [filler]
helpboard = helpboard * dims[n-1]
for i in reversed(range(n)):
if i != 1:
helpboard = [helpboard] * dims[i-1]
return helpboard
例如:
stuff = nd_mkboard([2, 4, 2], False)
print(stuff)
[[[False, False], [False, False], [False, False], [False, False]],
[[False, False], [False, False], [False, False], [False, False]]]
stuff[0][0][0] = True
print(stuff)
[[[True, False], [True, False], [True, False], [True, False]],
[[True, False], [True, False], [True, False], [True, False]]]
如何避免这个链接问题?我只想要:
[[[True, False], [False, False], [False, False], [False, False]],
[[False, False], [False, False], [False, False], [False, False]]]
列表是参考。所以复制列表就是复制引用,这意味着你最终指向的是同一个东西。
乘以列表就是制作多个副本,如上所述。
要解决此问题,请使用 list[:]
切片表示法克隆列表,或构建代码以在每次迭代时创建新列表。
就复制而言,您几乎注定要失败,因为这是您想要避免的。您可以使用 copy.deepcopy
,但最好只编写一个递归函数。
更新:
这是一个递归构建结构的函数,也可以处理构造的对象。
def make_structure(dim1, *args, fill=None):
fill = False if fill is None else fill
get_fill = lambda: fill() if callable(fill) else fill
result = []
for i in range(dim1):
if len(args):
result.append(make_structure(*args, fill=fill))
else:
result.append(get_fill())
return result
lines = [2,4,2]
s = make_structure(2,4,2)
print(s)
s[0][0][0] = True
print(s)
class TestObj:
def __init__(self):
self.id = id(self)
def __repr__(self):
return str(self.id)
s = make_structure(2,4,2,fill=TestObj)
print(s)
s[0][2][1] = TestObj()
print(s)
更新二:
列表而不是参数:
def make_structure(dims, fill=None):
fill = False if fill is None else fill
get_fill = lambda: fill() if callable(fill) else fill
result = []
for i in range(dims[0]):
if len(dims) > 1:
result.append(make_structure(dims[1:], fill=fill))
else:
result.append(get_fill())
return result
小问题,希望大家帮忙:
这是我的代码:
def nd_mkboard(dims, filler):
n = len(dims)
helpboard = [filler]
helpboard = helpboard * dims[n-1]
for i in reversed(range(n)):
if i != 1:
helpboard = [helpboard] * dims[i-1]
return helpboard
例如:
stuff = nd_mkboard([2, 4, 2], False)
print(stuff)
[[[False, False], [False, False], [False, False], [False, False]],
[[False, False], [False, False], [False, False], [False, False]]]
stuff[0][0][0] = True
print(stuff)
[[[True, False], [True, False], [True, False], [True, False]],
[[True, False], [True, False], [True, False], [True, False]]]
如何避免这个链接问题?我只想要:
[[[True, False], [False, False], [False, False], [False, False]],
[[False, False], [False, False], [False, False], [False, False]]]
列表是参考。所以复制列表就是复制引用,这意味着你最终指向的是同一个东西。
乘以列表就是制作多个副本,如上所述。
要解决此问题,请使用 list[:]
切片表示法克隆列表,或构建代码以在每次迭代时创建新列表。
就复制而言,您几乎注定要失败,因为这是您想要避免的。您可以使用 copy.deepcopy
,但最好只编写一个递归函数。
更新:
这是一个递归构建结构的函数,也可以处理构造的对象。
def make_structure(dim1, *args, fill=None):
fill = False if fill is None else fill
get_fill = lambda: fill() if callable(fill) else fill
result = []
for i in range(dim1):
if len(args):
result.append(make_structure(*args, fill=fill))
else:
result.append(get_fill())
return result
lines = [2,4,2]
s = make_structure(2,4,2)
print(s)
s[0][0][0] = True
print(s)
class TestObj:
def __init__(self):
self.id = id(self)
def __repr__(self):
return str(self.id)
s = make_structure(2,4,2,fill=TestObj)
print(s)
s[0][2][1] = TestObj()
print(s)
更新二:
列表而不是参数:
def make_structure(dims, fill=None):
fill = False if fill is None else fill
get_fill = lambda: fill() if callable(fill) else fill
result = []
for i in range(dims[0]):
if len(dims) > 1:
result.append(make_structure(dims[1:], fill=fill))
else:
result.append(get_fill())
return result