python - 不同模块中具有相同名称的类共享完全相同的名称字符串?

标签 python

有点令人惊讶的行为。不同模块中具有相同名称的两个类共享相同的名称。 (不是预期的相等,而是字符串对象标识!)

我不支持它真的很重要,但有人知道为什么,以及这里是否有可能带来进一步的惊喜?

演示(包含 a/a.pyb/b.py 以及 __init__.pya/ 中的空 b/)

>>> from a import a
>>> from b import b
>>> ta = a.Test()
>>> tb = b.Test()
>>> ta.__class__.__name__
'Test'
>>> tb.__class__.__name__
'Test'
>>> tb.__class__.__name__ is ta.__class__.__name__  # unexpected
True

>>> ta.__class__
<class 'a.a.Test'>
>>> tb.__class__
<class 'b.b.Test'>

最佳答案

这是 CPython 解释器的实现细节。

实习生标识符字符串;仅为源代码字符串创建一份副本,并在出现完全相同字符串值的任何地方重复使用。这使得字典包含测试更快(通过首先尝试指针比较)。

您可以使用 sys.intern() function 对您自己的字符串执行此操作,其中有帮助地指出:

Normally, the names used in Python programs are automatically interned, and the dictionaries used to hold module, class or instance attributes have interned keys.

另请参阅About the changing id of a Python immutable string

关于python - 不同模块中具有相同名称的类共享完全相同的名称字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40887978/

相关文章:

python - with()语句从opencv中的VideoCapture读取?

python - 是否可以使用 subprocess.Popen 与子子进程通信?

python - 在 Django 模板中将负数转换为正数?

python - 如何使用 DateTimeField 和 input_formats 在 Django 模型表单中显示验证错误

python - 使用 Python 进行谷歌搜索

python - 无需切片和导入的滚动/滑动窗口迭代器?

javascript - 使用 bokeh/flexx pyscript 在 Python 3.5 中进行交互式浏览器绘图

python - 尝试在 Python : "ImportError: cannot import name core" 中使用 gevent 库

python - Selenium/python 2.7 如何查找只有标题的元素?

python - 在Python中通过Pandas删除时间戳在上一个滑动窗口中的行