Stacey J
Stacey J

Reputation: 311

Python: can't assign to literal

My task is to write a program that asks the user to enter 5 names which it stores in a list. Next, it picks one of these names at random and declares that person as the winner. The only issue is that when I try to run it, it says can't assign to literal.

This is my 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!')

I have to be able to generate a random name.

Upvotes: 16

Views: 226033

Answers (9)

Dan Dukat
Dan Dukat

Reputation: 21

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!')

Upvotes: 1

tryingToLearn
tryingToLearn

Reputation: 11659

Just adding 1 more scenario which may give the same error:

If you try to assign values to multiple variables, then also you will receive same error. For e.g.

In C (and many other languages), this is possible:

int a=2, b=3;

In Python:

a=2, b=5

will give error:

can't assign to literal

EDIT:

As per Arne's comment below, you can do this in Python for single line assignments in a slightly different way: a, b = 2, 5

Upvotes: 27

Shagun Pruthi
Shagun Pruthi

Reputation: 2051

I got the same error: SyntaxError: can't assign to literal when I was trying to assign multiple variables in a single line.

I was assigning the values as shown below:

    score = 0, isDuplicate = None

When I shifted them to another line, it got resolved:

    score = 0
    isDuplicate = None

I don't know why python does not allow multiple assignments at the same line but that's how it is done.

There is one more way to asisgn it in single line ie. Separate them with a semicolon in place of comma. Check the code below:

score = 0 ; duplicate = None

Upvotes: 0

Manishearth
Manishearth

Reputation: 16188

The left hand side of the = operator needs to be a variable. What you're doing here is telling python: "You know the number one? Set it to the inputted string.". 1 is a literal number, not a variable. 1 is always 1, you can't "set" it to something else.

A variable is like a box in which you can store a value. 1 is a value that can be stored in the variable. The input call returns a string, another value that can be stored in a variable.

Instead, use lists:

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]))

Using a for loop, you can cut down even more:

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]))

Upvotes: 31

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 250881

1, 2, 3 ,... are invalid identifiers in python because first of all they are integer objects and secondly in python a variable name can't start with a number.

>>> 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

Valid identifier definition:

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

Upvotes: 4

Joe Doherty
Joe Doherty

Reputation: 3948

This is taken from the Python docs:

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.

That should explain how to name your variables.

Upvotes: 3

Eric
Eric

Reputation: 97565

1 is a literal. name = value is an assignment. 1 = value is an assignment to a literal, which makes no sense. Why would you want 1 to mean something other than 1?

Upvotes: 5

Mohit Gupta
Mohit Gupta

Reputation: 81

You should use variables to store the names.

Numbers can't store strings.

Upvotes: 1

Martijn Pieters
Martijn Pieters

Reputation: 1121366

You are trying to assign to literal integer values. 1, 2, etc. are not valid names; they are only valid integers:

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

You probably want to use a list or dictionary instead:

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

Using a list makes it much easier to pick a random value too:

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

Upvotes: 8

Related Questions