我写了一个python代码来解决一个难题。它没有按预期工作。因此,在调试时,我看到了一些很奇怪的东西。行是列表的列表。将1附加到单个row[n]将追加到row内的所有列表!
def trap( height):
row = []
for index, i in enumerate(height):
if i == 0 and len(row) == 0:
continue
else:
if(i > len(row)):#time for a new row
#to old rows append 0 below
for j in range(0, len(row)):
row[j].append(0)
row = row + [[0]] * (i - len(row))
else:
for j in range(0,i):
row[j].append(0)
#PROBLEMATIC CODE START
for jo in range(i,len(row)):
if(index == 1):
print("jays are",row)
print("jo is",jo, row[jo])
row[jo].append(1)
#PROBLEMATIC CODE END (I GUESS?)
print(row) #print this, it gives an idea
trap([2,0])
Run Code Online (Sandbox Code Playgroud)
当我独立尝试时,效果很好,请参见:
row = [[0],[0]]
index = 1
for jo in range(0,len(row)):
if(index == 1):
print("jays are",row)
print("jo is",jo, row[jo])
row[jo].append(1)
print(row)
Run Code Online (Sandbox Code Playgroud)
问题代码已在python中标记为comment #PROBLEMATIC CODE START和#PROBLEMATIC CODE END。调用trap()与[2,0]
行变量应该是,[[0,1],[0,1]]
但行变量要来了[[0,1,1],[0,1,1]]
我已经在这里待了很多小时了!我只是不明白为什么会.append()附加到行内的所有列表,但是当我尝试使用较小的代码时,它将起作用。请帮我指导
使用创建列表时*,您只是将引用复制到对象,而不是实例本身。简短示例:
>>> a = [["abv"]] * 3
>>> a
[['abv'], ['abv'], ['abv']]
>>> a[0].append(1)
>>> a
[['abv', 1], ['abv', 1], ['abv', 1]]
Run Code Online (Sandbox Code Playgroud)
我正在创建一个包含该对象["abv"]3次的列表。它都是同一对象,在列表中仅3次。当我编辑一个项目时,看起来所有项目都已更新,但实际上都是一样的。
您需要像这样创建列表,以便为每次迭代创建一个新对象:
>>> a = [["abv"] for _ in range(3)]
Run Code Online (Sandbox Code Playgroud)
因此,您的代码应更改为:
row += [[0] for x in range(i - len(row))]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |