pythondjangoloopsscope

'str' object has no attribute 'len'


Ive got a method that use to work by checking the first three letters/numbers and making sure they are the same before it continues like so

def combineProcess(request):
    carID1 = request.POST['carID1']
    carID2 = request.POST['carID2']
    for x in range (0,3):
        a += carID1.length(x)
        b += carID2.length(x)
    if a.equals(b):
        //do something

before it use to work now it stopped and i get this error.

Exception Type: UnboundLocalError
Exception Value:    

local variable 'a' referenced before assignment

which i never use to get a few weeks ago didnt change anything so i made a and b global.

def combineProcess(request):
    carID1 = request.POST['carID1']
    carID2 = request.POST['carID2']
    global a,b
    for x in range (0,3):
        a += carID1.length(x)
        b += carID2.length(x)
    if a.equals(b):
        //do something

Now I am getting this error.

Exception Type: NameError
Exception Value:    

name 'a' is not defined

Then i removed the global line and just put this

a = "P"

and got the following error

str object has no attribute length() or len()

which now has me puzzled how has this code stop working and why cant it recognize that a string object has a len() method. mainly I am lost how my code went from working to not working over a two weeks off.


Solution

  • Python String len() Method

    Syntax

    Following is the syntax for len() method −

    len( str )
    

    Example

    str = "this is string example....wow!!!";
    print("Length of the string: ", len(str))
    

    When we run above program, it produces following result −

    Length of the string:  32
    

    Reference: Python String len() Method

    UnboundLocalError: local variable 'a' referenced before assignment

    Explanation

    This is because, even though a and b exists, you're also using an assignment statement on the name a and b inside of the function combineProcess(). Naturally, this creates a variable inside the function's scope called a and b.

    The Python interpreter sees this at module load time and decides that the global scope's of a and b should not be used inside the local scope, which leads to a problem when you try to reference the variable before it is locally assigned.

    Example

    Var1 = 1
    Var2 = 0
    def function():
        if Var2 == 0 and Var1 > 0:
            print("Result One")
        Var1 =- 1
    
    function()
    

    If you run this program, it gives the following error.

    UnboundLocalError: local variable 'Var1' referenced before assignment
    

    Since, the value of Var1 is modified, this creates a variable inside the function's scope called Var1. As a result error is reported because of the condition check, Var1 > 0 before the Var1 =- 1 statement.

    But if we modify the code as follows.

    Var1 = 1
    Var2 = 0
    def function():
        global Var1
        if Var2 == 0 and Var1 > 0:
            print("Result One")
        Var1 =- 1
    
    function()
    

    Then it works fine.

    Note that, if we move the statement Var1 =- 1 before the if condition check, then it will not report any error even if you don't use global Var1 statement. So, the following code works fine.

    Var1 = 1
    Var2 = 0
    def function():
        Var1 =- 1
        if Var2 == 0 and Var1 > 0:
            print("Result One")
    
    function()
    

    Reference: See this SO answer.

    NameError: name 'a' is not defined

    Explanation

    Probably you are getting this error because in Python, you cannot compare two strings using equals() method. There is no such method exists.

    Example: Comparing two strings

    You can use > , < , <= , <= , == , != to compare two strings. Python compares string lexicographically i.e using ASCII value of the characters. For example, to compare two strings for equality, you can do as follows.

    if string1 == string2:
        // do something