gpt4 book ai didi

namespaces - Python 库基础知识

转载 作者:行者123 更新时间:2023-12-04 17:01:19 25 4
gpt4 key购买 nike

我不知道如何寻求关于这个问题的帮助,尽管我确定它之前被问过一百次。

这是我第一次尝试 Python 程序。它由两个文件组成,pythontest.pymain.pypythontest.py

myvar = ""

def setname(name):
myvar = name

def printname():
print(myvar)
main.py
import pythontest

pythontest.setname("Bob")

pythontest.printname()

当我跑 main.py在终端中,我没有打印输出,但也没有错误。我不知道为什么。我也不知道为什么我需要放 pythontest.在函数之前,因为我没有将它们设为私有(private)或任何东西,这也不是一个对象。

最佳答案

简短的回答是,如果您想修改全局变量,Python 希望您在函数中使用 global 关键字。因此,您需要执行以下操作:

def setname(name):
global myvar
myvar = name

因为你没有这样做,当 Python 解释器输入 setname 时,它创建了一个新的 myvar 变量,当它评估表达式 myvar = name 时,它是函数的本地变量。一旦该函数返回,本地 myvar 就被有效地删除了。全局 myvar 未受影响。

现在,Python 允许您在不使用 global 关键字的情况下读取全局变量。您的 printname 函数实际上是在打印一些东西,它恰好是一个空字符串,因为这是您分配给全局 myvar 变量的内容,并且它没有被 setname 更新。

这是 Python FAQ 的链接,更详细地解释了这一点:

https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python

编辑(解决第二个问题):

我强烈建议您阅读 Python 的 Modules 文档。简短的答案是有两个原因:
  • 当您导入一个模块时,Python 会实例化一个模块对象,将模块的内容加载到其中,然后提供一个变量来访问该对象。该变量局部作用于导入它的文件。该变量的名称是您导入的模块的名称,除非您更改它。导入模块中的函数是该模块对象的方法;因此,为什么需要使用 pythontest 来调用这些函数。这引出了第二点。
  • 如果您不想导入整个模块,则必须选择。首先,您可以从模块导入特定项目。例如,如果您只想导入函数,则可以使用以下语法:
  • from pythontest import setname, printname
    setname("Bob")
    printname()

    最终效果是,在我提供的这个例子中,Python 不会创建一个模块对象,而是为每个函数创建一个函数对象并将该对象分配给一个变量,该变量具有正在导入的函数的名称(例如,变量 setname 引用pythontest 中的 setname 函数)。以这种方式导入函数对象时,不需要提供 pythontest 前缀。

    其次,您可以在导入时为要导入的模块(或函数)提供不同的名称,然后在整个 Python 文件中使用该新名称。下面是一个例子:
    import pythontest as pt
    pt.setname("Bob")
    pt.printname()

    您甚至可以使用您导入的各个函数/变量来执行此操作:
    from pythontest import setname as really_cool_setname, printname as showname

    really_cool_setname("Bob")
    showname()

    边注:

    请记住,在 Python 中一切都是对象,甚至导入模块、函数和变量。

    关于namespaces - Python 库基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61879584/

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