Python:未定义 ball

0 投票
5 回答
1165 浏览
提问于 2025-04-15 19:12

我在运行这段代码时遇到了这个错误:

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

5 个回答

1

在你的程序中,ball 只是一个名字,它并不指向任何东西。使用像 a[i] 这样的索引时,a 必须指向一个已经可以进行索引的对象。类似地,a[i][j] 需要 a[i] 指向一个也支持索引的对象。

听起来你想让它指向一个列表的列表,但 这并不是一个很好的解决方案。你可能会更喜欢在 numpy 数组上进行操作,因为它可以简化你的循环,并且能大大加快计算速度。

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)]

后面的写法使用了两个列表推导式,更符合 Python 的风格,听起来更专业一些。

3

当你说 ball[i][j] 的时候,首先你得有一个叫 ball 的对象,这样才能进行两次索引操作。试试下面这段代码:

ball = []    
for i in range(5):
    ball.append([])
    for y in range(5):
        ball[i].append(sphere())

撰写回答