2024-03-28 08:42:19 发布
网友
为什么以下方法不起作用:
from sys import ps1 ps1 = 'something else '
但这是真的吗?在
如果我做个简单的测试
import sys from sys import ps1 ps1 = 'something else' sys.ps1 = 'something else'
第一个作业不起作用,但第二个作业有效。ps1和系统ps1是一样的,所以它们应该指同一件事,对吗?在
Python的import语句引起的混乱程度应该会让它的发明者夜不能寐!在
这是一个试图explain import的页面。它特别描述了:
导入X导入模块X,然后使用X.name引用模块X中定义的名称
从X import*导入模块X,但在 在X中定义的所有公共对象的当前命名空间。您使用name引用在X中定义的name,但X本身没有定义,因此X.name不起作用。
也许,从X import*查看的一种方法是,它几乎插入了模块X的整个源代码,因此您只需直接使用名称,就好像它是内联的一样,而不能使用X,因为它已经不存在了。在
请注意,从模块或包导入*的做法是frowned upon。在
简短的版本是:Assignment在Python中没有任何变化,它只是重新绑定名称。重新绑定一个不同的名称,该名称恰好当前绑定到与sys.ps1相同的字符串的引用,不会以任何方式影响sys.ps1。在
sys.ps1
让我们一步一步来:
from sys import ps1
它导入sys(但不绑定当前全局中的名称sys),然后将当前全局中的名称ps1绑定到与sys的ps1相同的对象。在
sys
ps1
这会将当前全局变量中的名称ps1重新绑定到与文本'something else'相同的对象。不可能影响sys模块。在
'something else'
import sys
它导入sys,然后将当前全局变量中的名称sys绑定到它。在
sys.ps1 = 'something else '
它在当前全局变量中查找名称sys,获得对sys模块的引用,然后将该模块中的名称ps1重新绑定到与文本'something else '相同的对象。在
'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.ps1和{}具有相同的ID,因为它们是引用同一对象的两个不同名称。在
而改变sys.ps1不会改变ps1。在
Python的import语句引起的混乱程度应该会让它的发明者夜不能寐!在
这是一个试图explain import的页面。它特别描述了:
导入X导入模块X,然后使用X.name引用模块X中定义的名称
从X import*导入模块X,但在 在X中定义的所有公共对象的当前命名空间。您使用name引用在X中定义的name,但X本身没有定义,因此X.name不起作用。
也许,从X import*查看的一种方法是,它几乎插入了模块X的整个源代码,因此您只需直接使用名称,就好像它是内联的一样,而不能使用X,因为它已经不存在了。在
请注意,从模块或包导入*的做法是frowned upon。在
简短的版本是:Assignment在Python中没有任何变化,它只是重新绑定名称。重新绑定一个不同的名称,该名称恰好当前绑定到与
sys.ps1
相同的字符串的引用,不会以任何方式影响sys.ps1
。在让我们一步一步来:
它导入
^{pr2}$sys
(但不绑定当前全局中的名称sys
),然后将当前全局中的名称ps1
绑定到与sys
的ps1
相同的对象。在这会将当前全局变量中的名称
ps1
重新绑定到与文本'something else'
相同的对象。不可能影响sys
模块。在它导入
sys
,然后将当前全局变量中的名称sys
绑定到它。在它在当前全局变量中查找名称
sys
,获得对sys
模块的引用,然后将该模块中的名称ps1
重新绑定到与文本'something else '
相同的对象。在或者,用伪Python术语代替英语
您的第一个代码示例如下:
你的第二个是这样的:
这是你在评论中所描述的文字记录。在
sys.ps1
和{而改变
sys.ps1
不会改变ps1
。在相关问题 更多 >
编程相关推荐