Python: kan niet toewijzen aan letterlijke

Mijn taak is om een programma te schrijven dat de gebruiker vraagt om 5 namen in te voeren die het opslaat in een lijst. Vervolgens kiest het willekeurig een van deze namen en verklaart die persoon de winnaar. Het enige probleem is dat wanneer ik het probeer uit te voeren, er staat can't assign to literal.

Dit is mijn code:

import random
1=input("Please enter name 1:")
2=int(input('Please enter name 2:'))
3=int(input('Please enter name 3:'))
4=int(input('Please enter name 4:'))
5=int(input('Please enter name 5:'))
name=random.randint(1,6)
print('Well done '+str(name)+'. You are the winner!')

Ik moet een willekeurige naam kunnen genereren.


Antwoord 1, autoriteit 100%

De linkerkant van de operator =moet een variabele zijn. Wat je hier doet, is tegen python zeggen: “Ken je de nummer één? Zet het op de ingevoerde string.”. 1is een letterlijk getal, geen variabele. 1is altijd 1, je kunt het niet op iets anders “instellen”.

Een variabele is als een vak waarin u een waarde kunt opslaan. 1is een waarde die in de variabele kan worden opgeslagen. De input-aanroep retourneert een string, een andere waarde die in een variabele kan worden opgeslagen.

Gebruik in plaats daarvan lijsten:

import random
namelist = []
namelist.append(input("Please enter name 1:"))  #Stored in namelist[0]
namelist.append(input('Please enter name 2:'))  #Stored in namelist[1]
namelist.append(input('Please enter name 3:'))  #Stored in namelist[2]
namelist.append(input('Please enter name 4:'))  #Stored in namelist[3]
namelist.append(input('Please enter name 5:'))  #Stored in namelist[4]
nameindex = random.randint(0, 5)
print('Well done {}. You are the winner!'.format(namelist[nameindex]))

Als je een for-lus gebruikt, kun je nog meer verminderen:

import random
namecount = 5
namelist=[]
for i in range(0, namecount):
  namelist.append(input("Please enter name %s:" % (i+1))) #Stored in namelist[i]
nameindex = random.randint(0, namecount)
print('Well done {}. You are the winner!'.format(namelist[nameindex]))

Antwoord 2, autoriteit 68%

Gewoon nog 1 scenario toevoegen dat dezelfde fout kan geven:

Als u waarden aan meerdere variabelen probeert toe te kennen, krijgt u dezelfde foutmelding. Voor bijv.

In C (en vele andere talen) is dit mogelijk:

int a=2, b=3;

In Python:

a=2, b=5

geeft fout:

kan niet toewijzen aan letterlijke

BEWERKEN:

Volgens Arne’sopmerking hieronder, kun je dit in Python doen voor toewijzingen van één regel op een iets andere manier:
a, b = 2, 5


Antwoord 3, autoriteit 23%

U probeert toe te wijzen aan letterlijke gehele getallen. 1, 2, etc. zijn geen geldige namen; het zijn alleen geldige gehele getallen:

>>> 1
1
>>> 1 = 'something'
  File "<stdin>", line 1
SyntaxError: can't assign to literal

U wilt waarschijnlijk in plaats daarvan een lijst of woordenboek gebruiken:

names = []
for i in range(1, 6):
    name = input("Please enter name {}:".format(i))
    names.append(name)

Het gebruik van een lijst maakt het ook veel gemakkelijker om een willekeurige waarde te kiezen:

winner = random.choice(names)
print('Well done {}. You are the winner!'.format(winner))

Antwoord 4, autoriteit 13%

1is een letterlijke. name = valueis een opdracht. 1 = valueis een toewijzing aan een letterlijke, wat geen zin heeft. Waarom zou je willen dat 1iets anders betekent dan 1?


Antwoord 5, autoriteit 13%

1, 2, 3 ,… zijn ongeldige identifiers in python omdat het in de eerste plaats integere objecten zijn en ten tweede in python kan een variabelenaam niet beginnen met een getal.

>>> 1 = 12    #you can't assign to an integer
  File "<ipython-input-177-30a62b7248f1>", line 1
SyntaxError: can't assign to literal
>>> 1a = 12   #1a is an invalid variable name
  File "<ipython-input-176-f818ca46b7dc>", line 1
    1a = 12
     ^
SyntaxError: invalid syntax

Geldige identificatiedefinitie:

identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"

Antwoord 6, autoriteit 10%

Dit is overgenomen uit de Python-documenten:

Identifiers (also referred to as names) are described by the following lexical definitions:
identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"
Identifiers are unlimited in length. Case is significant.

Dat zou moeten verklaren hoe u uw variabelen een naam geeft.


Antwoord 7

U moet variabelen gebruiken om de namen op te slaan.

Getallen kunnen geen tekenreeksen opslaan.


Antwoord 8

Ik kreeg dezelfde fout: SyntaxError: can’t assign to literaltoen ik probeerde meerdere variabelen in één regel toe te wijzen.

Ik kende de waarden toe zoals hieronder getoond:

   score = 0, isDuplicate = None

Toen ik ze naar een andere lijn verplaatste, werd het opgelost:

   score = 0
    isDuplicate = None

Ik weet niet waarom python niet meerdere opdrachten op dezelfde regel toestaat, maar zo wordt het gedaan.

Er is nog een manier om het in een enkele regel toe te wijzen, dwz. Scheid ze met een puntkomma in plaats van een komma. Controleer de onderstaande code:

score = 0 ; duplicate = None

Antwoord 9

import random
one = input("Please enter name one:")
two = input('Please enter name two:')
three = input('Please enter name three:')
four = input('Please enter name four:')
five =input('Please enter name five:')
name=random.randint(1,5)
name = str(name)
if name == "1":
    name = one
    print('Well done '+ name +'. You are the winner!')
elif name == "2":
    name = two
    print('Well done '+ name +'. You are the winner!')
elif name == "3":
    name = three
    print('Well done '+ name +'. You are the winner!')
elif name == "4":
    name = four
    print('Well done '+ name +'. You are the winner!')
else:
    name = five
    print('Well done '+ name +'. You are the winner!')

Other episodes