3 回答
TA贡献1820条经验 获得超10个赞
Python语言的每个实现都可以自由地在分配不可变对象(例如字符串)时做出权衡 - 要么创建一个新的对象,要么找到一个现有的等价对象并再使用一个对它的引用,就好了。观点看法。当然,在实践中,现实世界的实现需要合理的妥协:在定位这样的对象时,再一次提及合适的现有对象既便宜又容易,只要找到一个合适的现有对象(可能是可能不存在)看起来可能需要很长时间搜索。
因此,例如,在单个函数中多次出现相同的字符串文字(在我所知的所有实现中)都使用“对同一对象的新引用”策略,因为在构建该函数的常量池时,它非常快速且容易避免重复; 但是跨越不同的功能这样做可能是一项非常耗时的任务,因此现实世界的实施要么根本不做,要么只在一些启发式确定的案例子集中做到这一点,人们可以希望合理权衡编译时间(通过搜索相同的现有常量减慢)与内存消耗(如果继续生成新的常量副本,则增加)。
我不知道Python的任何实现(或者其他具有常量字符串的语言,例如Java)在从文件读取数据时会花费很多时间来识别可能的重复项(通过多个引用重用单个对象) - - 它似乎并不是一个很有希望的权衡(在这里你需要支付运行时间,而不是编译时间,因此权衡更具吸引力)。当然,如果您知道(由于应用程序级别的考虑因素)这些不可变对象很大并且很容易出现重复,您可以非常轻松地实现自己的“常量池”策略(实习生可以帮助您为字符串执行此操作,但是你不难推出自己的东西,例如,带有不可变项目的元组,巨大的长整数,
TA贡献1802条经验 获得超4个赞
旁注:了解Python中对象的生命周期非常重要。请注意以下会话:
Python 2.6.4 (r264:75706, Dec 26 2009, 01:03:10) [GCC 4.3.4] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> a="a">>> b="b">>> print id(a+b), id(b+a)134898720 134898720>>> print (a+b) is (b+a)False
您认为通过打印两个单独表达式的ID 并注意到“它们是相等的,两个表达式必须相等/等同/相同”是错误的。单行输出并不一定意味着它的所有内容都是在同一时刻创建和/或共存的。
如果您想知道两个对象是否是同一个对象,请直接询问Python(使用is
运算符)。
添加回答
举报