我无法弄清楚这有什么问题...
#!/usr/bin/env python
#
# Bugs.py
#
from __future__ import division
# No Module!
if __name__ != '__main__':
print "Bugs.py is not meant to be a module"
exit()
# App
import pygame, sys, random, math
pygame.init()
# Configuration Vars
conf = {
"start_energy": 50,
"food_energy": 25,
"mate_minenergy": 50,
"mate_useenergy": 35,
"lifespan": 300000
}
class Bugs:
def __init__(self):
self.list = []
self.timers= {}
# Names / colors for sexes
self.sex = ["Male", "Female"]
self.color = ["#CBCB25", "#A52A2A"]
# Bug info tracking
self.bugid = 0
self.buginfo = {"maxgen":0, "maxspeed":0}
def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
sex = sex if not sex == 2 else random.randint(0,1)
speed = speed if not speed == 0 else random.randint(1,3)
# Create new bug object
self.bugs.append(BugObj(sex, speed, generation, bugid, pygame.time.get_ticks, genes))
# Make sure it has a timer
if not self.timers[speed]:
self.timers[speed] = 1
pygame.time.set_timer(25 + speed, 1000 / speed)
# Update info tracking variables
if speed > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
if generation > self.buginfo["maxgen"] : self.buginfo["maxgen"] = generation
self.bugid += 1
def speed_count(self, speed):
a = 0
for i in list[:]:
if i.speed = speed:
a += 1
return a
class BugObj:
def __init__(self, sex, speed, generation, bugid, born, genes):
global conf
self.sex = sex
self.speed = speed
self.generation = generation
self.id = bugid
self.born = born
self.genes = genes
self.died = -1
self.energy = conf["start_energy"]
self.target = "None"
def update(self):
global conf
if self.age() > conf["lifespan"]:
self.die()
else:
f = closest_food()
m = closest_mate()
# If there's a potential mate
if m != 0 and self.energy > conf["mate_minenergy"]:
if not self.rect.colliderect(m.rect):
self.move_toward(m)
self.target = "Mate: " + str(m.rect.center)
else:
Bugs.mate(self, m)
self.target = "Mate: (Reached)"
elif f != 0:
if not self.rect.colliderect(f.rect):
self.move_toward(f)
self.target = "Food: " + str(f.rect.center)
else:
self.eat(f)
self.target = "Food: (Reached)"
else:
self.target = "Resting"
# Use energy
self.energy -= 0
def closest_food(self):
pass
def closest_mate(self):
pass
def age(self):
if self.died != -1:
return pygame.time.get_ticks - self.born
else:
return self.died - self.born
def die(self):
# Remove self from the list
Bugs.list.remove(self)
# Turn off timer
if not Bugs.speed_count(self.speed):
Bugs.timers[self.speed] = 0
pygame.time.timers(25 + self.speed, 0)
# Bye!
del self
class Food:
def __init__(self)
pass
def update(self)
pass
# Update Loop
while 1:
ev = pygame.event.wait()
speed = ev.type - 25
if speed > 24:
for i in Bugs.list[:]:
if i.speed = speed
i.update()
print "Updating bug #" + str(i.id)
if speed == 0:
Food.update()
我每次都会得到以下内容:
File "Bugs.py" line 53
def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
^
Indentation Error: unindent does not match any outer indentation level
答案 0 :(得分:55)
您的文件中可能有混合标签和空格。您可以使用python帮助检查
中的此类错误python -m tabnanny <name of python file>
答案 1 :(得分:6)
原始源文件中可能包含空格和制表符。用四个空格替换所有标签(反之亦然),您应该立即看到问题。
您粘贴到问题中的代码没有此问题,但我猜您的编辑器(或您的网络浏览器,或Stack Overflow本身......)可能在您不知情的情况下完成了标签到空格的转换。
答案 2 :(得分:4)
不要忘记使用“”评论。这些也需要精确的缩进(我也可以解决这个该死的错误的1/2小时工作!)
答案 3 :(得分:2)
我正在使用Ubuntu 11.10附带的gedit基本版本。 我有同样的错误。 这主要是因为您将空格与制表符混合使用。
区分哪些线路有问题的好方法是: 编辑 2.偏好 编辑 4.检查“自动缩进” 5.将缩进增加到12或一些大数
在完成第五步之后,您将能够看到代码中可能导致问题的行(这些是混合了空格和制表符的行)
使整个代码约定只是TAB或只是SPACE(必须逐行手动完成)
希望这会有所帮助......
答案 4 :(得分:1)
我在PyCharm中遇到了与IndentationError类似的问题。
我在代码中找不到任何标签,但是一旦我在使用IndentationError的行之后删除了代码,一切都很顺利。
我怀疑您在以下行中有一个标签:
sex = sex if not sex == 2 else random.randint(0,1)
答案 5 :(得分:1)
遇到相同的问题,我将代码复制到了jupyter 它向我显示了正确的间距,我用更正后的间距替换了错误的间距,并且有效
我实际上复制了正确的行,然后修改了我的文字
最后,我将我的代码返回复制到vs代码
答案 6 :(得分:0)
也许就是这部分:
if speed > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
if generation > self.buginfo["maxgen"] : self.buginfo["maxgen"] = generation
尝试删除多余的空格以使其看起来对齐。
修改:来自pep8
Yes: x = 1 y = 2 long_variable = 3 No: x = 1 y = 2 long_variable = 3
尝试遵循该编码风格。
答案 7 :(得分:0)
我建议您一直检查缩进级别。确保您一直使用任何一个标签或一直使用空格,没有混合。我过去曾经有过一些奇怪的压痕问题,这些问题都是混合造成的。
答案 8 :(得分:0)
抱歉,由于我的声誉不够高,我无法添加评论: - /,所以这必须是一个答案。
正如有几位评论所说,你发布的代码包含几(5)个语法错误(两次=而不是==和三次':'缺失)。
一旦语法错误得到纠正,我就没有任何问题,无论是缩进还是其他问题;当然,不可能看到你有其他人建议的混合标签和空格,这可能是你的问题。
但我要强调的真正意义是: tabnanny不可行:当它实际上只是语法错误时,你可能会收到“缩进”错误。
EG。当我添加一个超过必要的闭括号时,我得到了它; - )
i += [func(a, b, [c] if True else None))]
会引起tabnanny警告下一行。
希望这有帮助!
答案 9 :(得分:0)
Geany在其菜单中有一个选项,即“应用默认缩进”,如果在德国设置中指定,则用制表符号替换制表符
答案 10 :(得分:0)
对可视工作室用户的熟悉:我将代码直接从IDLE移动到Visual Studio时遇到了这个问题。当您按Tab键时,IDLE会添加4个空格而不是选项卡。在IDLE中,点击Ctl + A选择所有代码,然后转到格式&gt; Tabify Region。现在将代码移动到visual studio,大多数错误都应该修复。每隔一段时间就会出现一些非标签代码,只需手动修复即可。
答案 11 :(得分:0)
我有同样的问题,它与标签无关。这是我的问题代码:
def genericFunction(variable):
for line in variable:
line = variable
if variable != None:
return variable
请注意,上面的for
缩进的空格多于以if
开头的行。这是不好的。所有缩进必须一致。所以我想你可以说我有一个流浪空间,而不是一个流浪的标签。
答案 12 :(得分:0)
我在PyCharm中也遇到了这个问题。我进入代码菜单并选择了重新格式化代码。问题消失了。
答案 13 :(得分:0)
我有这个问题。这是因为我的代码中的空间错误。可能是下一行。删除所有空格和制表符并使用空格。
答案 14 :(得分:0)
我从博客复制的代码遇到了这个问题。我通过Shift + Tab'ing(取消缩进)最后一个抛出错误的代码块一直到最左侧来解决了PyCharm的问题,然后将其Tab's回到原来的位置。我想是间接地与上面的“重新格式化代码”注释相同。
答案 15 :(得分:0)
如果您是VSCode用户,则可能已选中Insert Spaces
选项。这将用空格替换您按的每个选项卡,从而导致此问题。取消选中它就可以了。