I'm currently doing a projecteuler problem, which requires finding the sum of all the primes below two million.

I have a primitive function which determines whether or not a number is prime. This function is incorporated into the below function to produce a list with all the primes below the target:

def prime_target(target):
    list = []
    i = 0
    while i <= target:
        i += 1
        if is_prime(i) == True:
            print len(list), list[-1]

I know this isn't efficient, but it's a quick and dirty method.

However, when I come to sum(list) in a later part of the code, I get the following:

Traceback (most recent call last):
  File "euler-sum-primes.py", line 32, in <module>
    total = sum(list)
TypeError: 'type' object is not iterable

But the list contains integers... and what is "type" type? I had a look through the documentation to find the answer, but it seems like I must be missing something obvious.

Any help much appreciated.

8 Years
Discussion Span
Last Post by MK12

Ok, so sum(list) works if it is inside the function, but returns a type error if it is outside the function.

Does this seems strange?


Well, 1) list is the name of a standard type in python (the type of list objects). A type is just a particular kind of object. 2) Since list is a standard name, it should be avoided as the name of a variable (it's not an error, but it's a bad idea), so the list that you're using in your function should be given another name, like plist . 3) Assuming you do this, the variable plist is local to the function's body. It doesn't exist in the global namespace. Note that your function doesn't return any value, so a good idea would be to add an instruction return plist at the end of the body. 4) Assuming you do this, you can then write plist = prime_target(target) at global level, and this defines a global variable plist (which could be given another name). You can then compute sum(plist) !


Not really that important, but just so you know: if is_prime(i) == True: , the "== True" is redundant there since it already returns a boolean. Change it to if is_prime(i): .

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.