我收到此错误:
Traceback (most recent call last):
File "D:/Python26/PYTHON-PROGRAMME/049 bam", line 9, in <module>
ball[i][j]=sphere()
NameError: name 'ball' is not defined
当我运行此代码时。但球被定义(ball [i] [j] = sphere())。不是吗?
#2D-wave
#VPython
from visual import *
#ball array #ready
for i in range(5):
for y in range(5):
ball[i][j]=sphere()
timer = 0
dt = 0.001
while(1):
timer += dt
for i in range(5):
for y in range(5):
#wave equation
x = sqrt(i**2 + j**2) # x = distance to the source
ball[i][j].pos.y = amplitude * sin (k * x + omega * timer)
if timer > 5:
break
答案 0 :(得分:3)
不,ball
未定义。您需要先创建list()
,然后才能开始分配列表的索引。同样,在分配嵌套列表之前,需要先创建嵌套列表。试试这个:
ball = [None] * 5
for i in range(5):
ball[i] = [None] * 5
for j in range(5):
ball[i][j]=sphere()
或者这个:
ball = [[sphere() for y in range(5)] for x in range(5)]
使用两个列表推导的后一种语法更加惯用 - 如果你愿意的话,更多的是Pythonic。
答案 1 :(得分:3)
当您说ball[i][j]
时,您必须已经有一些对象ball
,以便您可以将其编入索引(两次)。请尝试使用此细分:
ball = []
for i in range(5):
ball.append([])
for y in range(5):
ball[i].append(sphere())
答案 2 :(得分:1)
Python不知道ball
是一个列表。在使用它之前(在第一个for
循环中),您必须将其初始化为
ball = []
因此Python知道将其视为列表。
答案 3 :(得分:1)
未定义ball
。这一行:ball[i][j]=sphere()
为对象ball
指向的元素赋值。没有任何ball
分,因此无法分配任何东西。
答案 4 :(得分:1)
在您的程序中,ball
只是一个不引用任何内容的名称。使用a[i]
之类的索引要求a
引用已支持索引的对象。同样,a[i][j]
要求a[i]
引用支持索引的对象。
听起来您希望它引用列表列表,但这不是一个很好的解决方案。在numpy数组上执行操作可能会更快乐,这会抽象出所有循环,并且可以真正加速计算。