使用 += 运算符的语法无效

Invalid syntax using += operator

我在 python 中使用 += 时总是出现语法错误 这是我的代码。我也遇到了非本地问题。 我收到很多错误,包括语法错误和未绑定的本地错误 提前致谢!!!

更新:添加了更多代码 这是所有的代码 它现在说 赋值前引用的局部变量'citizens'

from time import sleep as slp
import time
import sys
def clear():
  print("3[2J3[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 citizens 必须在单独的一行上。试试这个:

import random
rd = random.randint
citizens = rd(10000, 1000000)
def function():
   rnum = rd(1,citizens/2)
   nonlocal citizens
   citizens -= rnum

这段代码的三件事:

  1. rnum 分配将失败,因为您没有进行整数除法
  2. 在这种情况下,您实际上想要 global 而不是 non-local。虽然你应该避免像这样使用全局变量。
  3. 您可以将第二行作为第一行的一部分

这就是我想你想要的:

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   

尽管我建议完全避免非本地,因为它会导致很多错误。我建议在风格上做这样的事情:

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 and a good video 关于范围在 python 中的工作原理,但一个好的经验法则是只保留本地的所有内容。