1928年,满洲。日本翻译伊丹英彦(仲村亨饰)离开中国情侣丁慧(章子怡饰)返回东京。数年后他到上海时,已成为一名特务。而丁慧目睹了主办抗日报纸的哥哥被日本人刺杀,之后来到上海,参加了对日地下抵抗组织,并与组织首领谢明(冯远征饰)产生感情。
抵抗组织从外地聘请了一名杀手,计划暗杀日本情报人员山本。在火车站,一个非常偶然的纰漏,使火车上坐在该杀手对面的小职员司徒(刘烨饰)被误以为是杀手。抵抗组织成
员上前与司徒接头并提供暗杀对象资料,“杀手”的异常反应引起混乱,枪战中,负责掩护接头者的丁慧误杀了来接站的司徒女友依玲(李冰冰饰)。
拿到资料的司徒被山本的手下伊丹英彦抓获,严刑拷打之下的他对这一切懵然无知。伊丹从抵抗组织内部的奸细处得知司徒的确是盲打误撞进来的倒霉蛋,便把他放了。抵抗组织却认为被释放的司徒已成为汉奸,要将其消灭。司徒从一个局外人变成深陷混乱,受到日本情报机关与抵抗组织的双重威胁,却对任何一方都完全无法解释。而伊丹偶遇旧情人丁慧,两人的会面偏又被司徒发现,这让司徒对身边的事情彻底迷惑,而为依玲的复仇更是完全没有目标。
对失去真正杀手的抵抗组织来说,他们必须自己完成暗杀山本的计划。新旧情人正好分处两个阵营的丁慧,成为双方互相设局必须利用的重要对象,加之误杀无辜的内心折磨,她同样极度茫然。
丁慧随伊丹来到日本人的会所参加聚会,两人相拥起舞。伊丹告诉丁慧,山本不会来了,谢明也不会来了,他已经死了。震惊的丁慧刺伤伊丹,司徒闯进舞场,枪杀伊丹之后,调转枪口对准了丁慧。