Domenico Criscito scored the decisive penalty for Zenit, who lifted the trophy a third time after their 2008 and 2011 wins.
Zenit coach Andre Villas-Boas handed debuts to former Dynamo Moscow midfielder Artur Yusupov and ex-Spartak forward Artem Dzyuba in the match played at their home stadium.
The first half was a tight affair but Lokomotiv took the lead after 28 minutes through Senegalese forward Baye Oumar Niasse`s shot from outside the penalty area.
James Rodriguez completes Qatar move to end time at Everton
After the break Villas-Boas`s side took a grip on the game but they had to wait until the 83rd minute to equalise with a header by defender Igor Smolnikov.
Extra time failed to separate the teams so the match went to a shootout and Zenit triumphed with Criscito's spot kick after Lokomotiv's Maxim Grigoryev and Vedran Corluka both missed.
Premier League to resume on Boxing Day in 2022 after six-week World Cup break
'We won three matches not 30' - Mourinho urges caution at 'euphoric' Roma