为何 Python 变量没有 Data Type 概念 ? 可以与任意 Data Type 绑定?
Python 变量 Variable 与其他程式语言不同之处在于:
> variable 不是对内存地址 ram address 的引用,而是对 data 的引用
> variable 被重新 assign 新値时,Python 新分配此data 存储空间,而 variable 指向此新的地址
例如: 启动 Python时,其 name space 如下:
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <cl
ass '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {
}, '__builtins__': <module 'builtins' (built-in)>}
当将 5 给 X 时,其先分配 5 这存储空间,此空间的位置地址为 8791319470864,而 X 存储此地址,指向 5 这物件:
>>> X = 5
>>> id(X)
8791319470864
所以 name space 存在一个 variable 其 value 为 5
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <cl
ass '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {
}, '__builtins__': <module 'builtins' (built-in)>, 'X': 5}
当重新指定 X 为字串 'Hello' 时,Python 会分配存储空间给 'Hello',其空间所在的地址为 35659880,而 X 存储此地址,指向 'Hello':
>>> X = 'Hello'
>>> id(X)
35659880
再次查看全域 Global 命名空间,发现 X 指向的値为最新的 'Hello',之前的値 5 已不在被指引了。但,物件 5 仍存储在 RAM 中。
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <cl
ass '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {
}, '__builtins__': <module 'builtins' (built-in)>, 'X': 'Hello'}
>>> id(5)
8791319470864
结论:
Python 的变量 variable 是动态绑定,即在 Run Time 执行中才动态绑定,这与 C / C++ / Java 不同。后者在编译 compiling 即绑定,为静态绑定,绑定后不能更改资料型态 data type。
来源:https://blog.csdn.net/cmdos/article/details/100054671