Q:

How to run for loop with unique values

Instead of two shapefiles that are saved in fcList in this loop I would like to do KernelDensity on the unique values of one shapefile.
Does anyone have an idea how this might work?
import arcpy,os
from arcpy import env
env.workspace = r'C:\Users\lhark\Desktop\SHK\ArcGis_Proj_Canada\shapefiles'
outworkspace = r'C:\Users\lhark\Desktop\SHK\ArcGis_Proj_Canada\KernelDensity'

fcList = arcpy.ListFeatureClasses ()
for fc in fcList:
outKDens = KernelDensity(fc,"NONE",4670)
outKDens.save(outworkspace + "/" + os.path.splitext(fc)[0] + "_kd.tif"

A:

Although Hornbydd is absolutely correct (+1 for that by the way), the first part of the question is to loop through all the unique values in a field.. this snippet should be usable in your existing code:
FieldToUse = "Field" # change this to your field name with the unique values
for fc in fcList:
    uVals = [] # new empty list
    # loop through each feature with a searchcursor
    with arcpy.da.SearchCursor(fc,FieldToUse) as SCur:
        for row in SCur:
            # check if the value is already in the list
            if row[0] not in uVals:
                uVals.append(row[0]) # add new value to list

    #loop through each unique field value
    for FieldValue in uVals:
        # create a layer with a where clause, this is for numeric fields
        arcpy.MakeFeatureLayer_management(fc,"Layer","{} = {}".format(FieldToUse,FieldValue))
        # use "{} = \'{}\'".format(FieldToUse,FieldValue) to quote the value
        # if the input field is a string field
        OutTIFFname = "{}_{}_kd.tif".format(os.path.splitext(fc)[0],FieldValue)
        outKDens = KernelDensity("Layer","NONE",4670)
        outKDens.save(os.path.join(outWorkspace,OutTIFFname))
        del "Layer" # clean up when you're done
        del outKDens

The process is fairly straightforward:

Start with a new empty list: uVals = []. This instructs python that the new variable will be a list containing no elements.
Open a search cursor on your feature class and loop through each feature; because you're not changing anything this is surprisingly quick.
If the value of your field is not already in the list then add (append) it to the list, that way there is only one instance of each unique value. Note that the list is not sorted and can appear in any order.
Loop through the unique value list and for each unique field value create a feature layer with a where clause. I am using string.format to create the where clause which I find tidier than simple concatenation (with '+' operator). I have changed the name of the outputs to include the unique value of the field that was used for each raster. I have also used os.path.join to concatenate your output path and file name; join uses the correct character required by your operating system when appending which makes the script more robust.

A:

If you read the help file for this tool and look at the syntax section what does it takes as input? A Feature Layer. Unlike a Feature Class, you can do selections on Feature Layers. As all geo-processing tools honour selections first all you need to do is select the points of interest and have that selection feed into the Kernel Density tool.

So you need to convert you FeatureClass to a FeatureLayer using the Make FeatureLayer tool
Select by Atttibute to create the selection of interest
Feed the layer with it's selection into Kernel Density tool.

