Python:球未定义

时间:2010-02-12 18:08:30

标签: python arrays

我收到此错误:

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 个答案:

答案 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数组上执行操作可能会更快乐,这会抽象出所有循环,并且可以真正加速计算。