Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python如何处理来自;“其他地方”;_Python_Object_Memory_Import - Fatal编程技术网

Python如何处理来自;“其他地方”;

Python如何处理来自;“其他地方”;,python,object,memory,import,Python,Object,Memory,Import,这可能是一个愚蠢的问题,但我不明白Python如何使用我们没有定义或导入的对象 考虑以下使用Python模块的示例: from datetime导入日期 日期1=日期(2019,1,1) 日期2=日期(2019年1月5日) 类型(date2-date1)# 类型(日期2)# 然后date2-date1属于timedelta类,即使我们还没有导入它 (我可能还可以编写其他示例,在这些示例中,我们可以获取对象,尽管我们还没有定义它们。) 这怎么可能 我是否应该考虑这些新对象,它们只是作为内存中由其

这可能是一个愚蠢的问题,但我不明白Python如何使用我们没有定义或导入的对象

考虑以下使用Python模块的示例:

from datetime导入日期
日期1=日期(2019,1,1)
日期2=日期(2019年1月5日)
类型(date2-date1)#
类型(日期2)#
然后
date2-date1
属于
timedelta
类,即使我们还没有导入它

(我可能还可以编写其他示例,在这些示例中,我们可以获取对象,尽管我们还没有定义它们。)

这怎么可能


我是否应该考虑这些新对象,它们只是作为内存中由其他函数返回的片段出现,即使我们没有定义它们,它们“本身”也包含足够的信息,以便Python解释器可以有意义地应用
type()
和其他函数?

您错误地认为
import
限制了加载到内存中的内容<代码>导入限制模块全局文件中绑定的名称

整个模块仍然被加载,该模块的依赖项也是如此。仅仅因为您的命名空间没有绑定对
datetime.timedelta
对象的引用,并不意味着它对
datetime
模块不可用

见:

来自表单的
使用了稍微复杂一些的过程:

  • 查找
    from
    子句中指定的模块,必要时加载并初始化该模块
  • 对于
    导入
    条款中指定的每个标识符:
  • 检查导入的模块是否具有该名称的属性
  • 如果没有,请尝试导入具有该名称的子模块,然后再次检查导入的模块是否具有该属性
  • 如果未找到该属性,将引发
    ImportError
  • 否则,对该值的引用将存储在本地命名空间中,如果存在,则使用as子句中的名称,否则使用属性名称
  • 因此,模块的加载和初始化是一个单独的步骤,每个模块执行一次。第二步绑定命名空间中的名称

    from datetime import date
    确保加载了
    datetime
    模块,然后查找
    datetime.date
    并将
    date=datetime.date
    添加到命名空间中

    如果要查看加载了哪些模块,请查看。这是要查看给定模块是否已加载的位置

    from datetime import date
    

    Date正在某处导入timedelta,因为它可能是一个依赖项,即使您没有看到它。

    谢谢!SE仍然让我等了9分钟,直到我能接受你的答案:)但与此同时,为了好玩,让我问:是否有可能通过某种方式诱使我的代码定义一个对象,将其存储在某个地方,然后用另一个Python脚本加载它,因此,我实际上在运行时得到了一个在Python脚本前面没有定义的对象?类似于
    import datetime
    date=datetime.date
    del datetime
    @Ayxan啊,但是我失去了对我的对象的引用。我希望仍然能够引用它,但对象没有在前面定义,只是占用了我内存中的某个区域(我不确定我所问的是否有意义,我只是试图将我对Python解释器内部工作的模糊理解形式化)。@Ayxan:sorta不是真的,因为这必须假设名称
    datetime
    尚未绑定到其他内容
    date=\uu导入('datetime',fromlist=['date'])。date
    更近了。@G.Anderson:这是纯Python实现,在绝大多数安装中,所有这些名称都被来自{u datetime import*
    进一步删除,以加载,其中调用创建
    timedelta
    实例。+1。你知道当我导入一个给定的模块时,有没有办法突出显示所有导入的依赖项?@l7ll7:这比你想象的要复杂得多。您可以快照
    sys.modules
    (这只会给您提供尚未加载的依赖项)或将
    bltins.\uuuuu import\uuuuuu
    替换为跟踪导入内容的包装函数(但不会跟踪加载更多模块的扩展模块)。@MartijnPieters哇,好的,我会将其保存到稍后的SE问题中,当我对Python了解更多的时候。。。
    from datetime import date