To get the value of the decision variable, you need to use the varValue property of the LpVariable, so:
print(x.varValue)
You can also use:
print(x.value())
The explanation is that the Python variable x is not the decision variable itself, it is a PuLP object of type LpVariable:
In[5]: type(x)
Out[5]: pulp.pulp.LpVariable
Therefore, just using print(x) does not give you the value of the decision variable, it gives you the variable name that you supplied in the name argument when you declared your LpVariable. (In particular, Python is printing the string returned by the LpVariable's __repr__ function, which is just the name.)
You can also access the name of a variable using the name property. This is also convenient for listing all of the variables at once:
for v in prob.variables():
print(v.name, "=", v.varValue)
Here's a more complete example, using Hillier and Lieberman's (in)famous "Wyndor Glass" model:
from pulp import *
prob = LpProblem('glass', LpMaximize)
# Declare variables.
x1 = LpVariable('x1_var', lowBound=0, upBound=None, cat=LpContinuous)
x2 = LpVariable('x2_var', lowBound=0, upBound=None, cat=LpContinuous)
# Build objective function.
prob += 3 * x1 + 5 * x2
# Add constraints.
prob += x1 <= 4
prob += 2 * x2 <= 12
prob += 3 * x1 + 2 * x2 <= 18
# Solve problem.
prob.solve()
# Print status.
print("Status:", LpStatus[prob.status], "\n")
print("The value of x1 = {}. (Not what we want.)".format(x1))
print("The values of x1.value() and x1.varValue = {} and {}. (That's what we want.)\n".format(x1.value(), x1.varValue))
# Print optimal values of decision variables.
print("All variables:")
for v in prob.variables():
print(v.name, "=", v.varValue)
The output is:
Status: Optimal
The value of x1 = x1_var. (Not what we want.)
The values of x1.value() and x1.varValue = 2.0 and 2.0. (That's what we want.)
All variables:
x1_var = 2.0
x2_var = 6.0
Note that the idea is the same if we declare the variables using LpVariable.dicts, e.g.:
x = LpVariable.dicts('x_var', range(1, 3), lowBound=0, upBound=None, cat=LpContinuous)
prob += 3 * x[1] + 5 * x[2]
(etc.)
Then print(x[1]) gives
x_var_1
and print(x[1].varValue) gives
2.0