使用 += 运算符的语法无效
Posted
技术标签:
【中文标题】使用 += 运算符的语法无效【英文标题】:Invalid syntax using += operator 【发布时间】:2020-08-21 16:42:38 【问题描述】:在 python 中使用 += 时,我不断收到语法错误 这是我的代码。我也有非本地的麻烦。 我收到很多错误,包括语法错误和未绑定的本地错误 先谢谢了!!!
更新:添加了更多代码 这是所有的代码 现在说 赋值前引用的局部变量“citizens”
from time import sleep as slp
import time
import sys
def clear():
print("\033[2J\033[H", end="")
def slow(text, endl="\n"):
for c in text:
sys.stdout.write(c)
sys.stdout.flush()
time.sleep(0.05)
print(endl, end="")
def slow_in(prompt=''):
slow(prompt, endl="")
return input()
import random
def generate():
import random
slow("generating random circumstance...")
slp(2)
slow("done")
rd = random.randint
money = rd(1, 100)
health = 100
global citizens
citizens = rd(10000, 1000000)
supporters = rd(1,1000000)
def show():
print("money-" + str(money))
print("health-" + str(health))
print("citizens-" + str(citizens))
print("suppporters-" + str(supporters))
waysod = [""]
def death():
wod = random.choice(waysod)
rnum = rd(1,citizens//2)
citizens -= rnum
print(str(rnum) + " citizens died " + wod)
return citizens
import random
rd = random.randint
slow("Welcome to presidential nightmare! ")
from time import sleep as slp
slp(.6)
slow("The easiest thing to do in this game is, well...")
slp(.8)
slow("destroy the country!!")
slp(.6)
slow("lets get started!!!")
slp(.6)
slow_in("press enter to continue...")
generate()
show()
death()
【问题讨论】:
去掉nonlocal
关键字,你没有正确使用它,这里不需要它。 ***.com/questions/1261875/python-nonlocal-statement
nonlocal 仅在嵌套范围内有效,并且必须在自己的行中。
你的 death() 函数需要带一个参数。考虑这一点的最简单方法是,每个功能都是一个房子,当你在房子里时,你不能和房子外面的人交谈,所以你需要把他们带进去。因此,在您的情况下,您需要执行 def death(citizens): # Put code in here 此外,最好在 cmets 中提出后续问题或在堆栈溢出上发布新帖子,因为我发布的答案对这段代码不再有意义。
【参考方案1】:
问题是nonlocal citizens
必须在单独的行上。试试这个:
import random
rd = random.randint
citizens = rd(10000, 1000000)
def function():
rnum = rd(1,citizens/2)
nonlocal citizens
citizens -= rnum
【讨论】:
在这种情况下他们不应该使用nonlocal
如果这是在模块级别,你会得到一个不同的语法错误。
是的,我同意。我只是建议使用他的代码来解决他的错误。【参考方案2】:
这段代码的三件事:
-
rnum 分配将失败,因为您没有进行整数除法
在这种情况下,您实际上想要
global
而不是non-local
。虽然您应该避免使用这样的全局变量。
您可以将第二行作为第一行的一部分进行
这就是我认为你想要的:
from random import randint as rd
citizens = rd(10000, 1000000)
def function():
global citizens # Tells python you want the global value
rnum = rd(1,citizens//2) # Uses the global value since python knows to do that
citizens -= rnum
虽然我建议完全避免使用 nonlocal,因为它可能会导致许多错误。我建议在风格上做这样的事情:
from random import randint as rd
citizens = rd(10000, 1000000) # Initialize citizens to a random value
def reduce_citizens(citizens:int) -> int:
"""Reduces the number of citizens by up to half of the current amount"""
rnum = rd(1,citizens//2)
citizens -= rnum # Since the value is being passed into the function directly we don't need global
return citizens # give the new value back so it can be used
citizens = reduce_citizens(citizens) # Take the current value of citizens and remove some then reassign to citizens
上述代码的好处是可以与多组公民一起使用,例如:
from random import randint as rd
citizens = rd(10000, 1000000) # Initialize citizens to a random value
citizens_2 = rd(10000, 1000000) # Initialize a second set of citizens to a random value
citizens_3 = rd(10000, 1000000) # Initialize a third set of citizens to a random value
def reduce_citizens(citizens:int) -> int:
"""Reduces the number of citizens by up to half of the current amount"""
rnum = rd(1,citizens//2)
citizens -= rnum
return citizens
citizens = reduce_citizens(citizens) # Take the current value of citizens and remove some then reassign to citizens
citizens_2 = reduce_citizens(citizens) # Take the current value of citizens_2 and remove some then reassign to citizens
citizens_3 = reduce_citizens(citizens) # Take the current value of citizens_3 and remove some then reassign to citizens
Here is a good article 和 good video 了解作用域在 python 中的工作原理,但一个好的经验法则是尽可能将所有内容保留在本地。
【讨论】:
我贴错了代码。我现在确实需要 nonlocal 关键字 您介意发布其余代码吗,通常可以(并且应该)通过使用不同的变量名或更好的状态管理形式来避免非本地代码。唯一真正的例外是装饰器函数。以上是关于使用 += 运算符的语法无效的主要内容,如果未能解决你的问题,请参考以下文章
在 queryDSL 中使用 postgresql 数组覆盖运算符的语法