gpt4 book ai didi

Python 导入和模块作用域(特别是 sys.ps1)

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:11 26 4
gpt4 key购买 nike

为什么以下不起作用:

from sys import ps1
ps1 = 'something else '

但是这样可以吗?

import sys
sys.ps1 = 'something else '

如果我运行简单测试

import sys
from sys import ps1
ps1 = 'something else'
sys.ps1 = 'something else'

第一个作业不起作用,但第二个作业起作用。 ps1 和 sys.ps1 的 id() 是相同的,所以它们应该指的是同一个东西,对吧?

最佳答案

简短的版本是:赋值不会改变 Python 中的任何内容,它只是重新绑定(bind)名称。重新绑定(bind)一个不同的名称,恰好当前绑定(bind)到对与 sys.ps1 相同的字符串的引用不会以任何方式影响 sys.ps1

让我们一步一步来:

from sys import ps1

这会导入 sys(但不会在当前全局变量中绑定(bind)名称 sys),然后在当前全局变量中绑定(bind)名称 ps1全局变量为与 sysps1 相同的对象。

ps1 = 'something else '

这会将当前全局变量中的名称 ps1 重新绑定(bind)到与文字 'something else' 相同的对象。不可能影响 sys 模块。

import sys

这会导入 sys,然后将当前全局变量中的名称 sys 绑定(bind)到它。

sys.ps1 = 'something else '

这会在当前全局变量中查找名称 sys,获取对 sys 模块的引用,然后在其中重新绑定(bind)名称 ps1模块与文字 'something else' 相同的对象。


或者,用伪 Python 术语代替英语……

你的第一个代码示例是这样的:

tempspace._sys = __import__('sys')
globals.ps1 = tempspace._sys.ps1
del tempspace._sys
globals.ps1 = 'something else '

你的第二个是这样的:

globals.sys = sys_modules.sys = __import__('sys')
globals.sys.ps1 = 'something else '

这是您在评论中描述的文字记录。

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> from sys import ps1
>>> id(sys.ps1)
4360831168
>>> id(ps1)
4360831168
>>> sys.ps1 = 'something else '
something else ps1
'>>> '
something else

sys.ps1ps1 具有相同的 ID,因为它们是引用同一对象的两个不同名称。

并且更改 sys.ps1 不会更改 ps1

关于Python 导入和模块作用域(特别是 sys.ps1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16114127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com