IronPython和标准Python(“ cPython”)之间存在一些细微差异和不兼容之处。有些是IronPython中的直接错误,应在以后的版本中将其删除。但是,其他被认为是“实现细节”,并且将保留。其中一些是非常具有挑战性的主题。
对于用户而言,最明显的区别是字符串的处理。原始cPython对于字节字符串和Unicode字符串具有两种不同的字符串类型。此概念类似于IEC中的STRING和WSTRING数据类型。IronPython仅使用始终支持Unicode的.NET字符串,并在内部使用UTF-16。但是,IronPython实现了一个技巧,可以向程序员隐藏与cPython的区别。(有趣的是,开发人员完全重新设计了新Python版本3的字符串处理。开发了一个与IronPython更加接近的模块。之后,仅使用Unicode字符串,并且存在用于处理原始字节的单独的数据类型。)
无法使用C语言编写的Python模块导入IronPython,因为cPython使用的内部数据结构与IronPython完全不同。大多数标准库模块已在IronPython中重新实现。但是,某些模块(例如TK接口)只要不明确地移植到IronPython中就不可用。另一方面,IronPython提供了对.NET程序集的访问,包括.NET框架(如上所示),它可以弥补此功能的不足。
尽管cPython使用引用计数和确定性垃圾收集器清除循环垃圾,但IronPython依赖于非确定性.NET垃圾收集器。在大多数情况下,这种差异并不重要。但是,当你从Python标准库或.NET框架打开文件或其他资源时,应确保稍后将其关闭。最好将with语句与Python上下文管理器或.NET IDisposable实例一起使用。