Retrieve min from stack in O(1)
Your implementation fails if there are duplicates values in the stack:

def main():
    stack = SmartStack()
    stack.stack_push(1)
    stack.stack_push(1)
    stack.stack_push(3)
    stack.stack_pop()
    stack.stack_pop()
    print(stack.stack_min())



$ ./smartstack 
Traceback (most recent call last):
  File "./smartstack", line 35, in &lt;module&gt;
    main()
  File "./smartstack", line 32, in main
    print(stack.stack_min())
  File "./smartstack", line 23, in stack_min
    return self.min[-1]
IndexError: list index out of range



Suggested fix:

def stack_push(self,x):
    self.stack.append(x)
    if not self.min or x &lt;= self.stack_min():
        self.min.append(x)


The naming is redundant: methods of the SmartStack class shouldn't need to have "stack_" in their names.

If you are targeting Python 2, be sure to use new-style classes (i.e., SmartStack should have object as a superclass).