namespaces - Python 库基础知识
问题描述
我不知道如何在这个问题上寻求帮助,尽管我确信它之前被问过一百次。
这是我第一次尝试 Python 程序。它由两个文件组成,pythontest.py
并且main.py
pythontest.py
myvar = ""
def setname(name):
myvar = name
def printname():
print(myvar)
main.py
import pythontest
pythontest.setname("Bob")
pythontest.printname()
当我main.py
在终端中运行时,我没有得到打印输出,但也没有错误。我不知道为什么。我也不知道为什么我需要把函数放在pythontest.
函数之前,因为我没有将它们设为私有或任何东西,这也不是一个对象。
解决方案
global
简短的回答是,如果您希望修改全局变量,Python 期望您在函数中使用关键字。因此,您需要执行以下操作:
def setname(name):
global myvar
myvar = name
因为您没有这样做,所以当 Python 解释器进入setname
它时,它创建了一个新myvar
变量,该变量在计算表达式时是函数的本地变量myvar = name
。一旦该函数返回,该本地myvar
就被有效地删除了。全球myvar
没有受到影响。
global
现在,Python 允许您在不使用关键字的情况下读取全局变量。您的printname
函数实际上正在打印一些东西,它恰好是一个空字符串,因为这是您分配给全局myvar
变量的内容,并且它没有被setname
.
这是一个指向 Python FAQ 的链接,它更详细地解释了这一点:
编辑(解决第二个问题):
我强烈建议阅读 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 中的一切都是对象,甚至导入模块、函数和变量。
推荐阅读
- python - 仅在没有重复项的情况下如何将行添加到文件中?
- openshift - Nifi图像未在openshift上运行
- github - Julia 文档“加载密钥:格式无效”
- kubernetes - 在 Airflow 的环境变量中设置变量
- c# - 访问函数体内的存储帐户连接字符串
- excel - 2个功能合二为一
- logistic-regression - 网格搜索准确率 100%?怎么了?
- javascript - 将 8 位数字数组转换为长布尔值数组并返回 JavaScript 的最有效方法是什么?
- c++ - 运行可执行文件时出现 FFTW 错误“找不到符号:_ompi_mpi_char”
- azure - 如何在 ARM 模板的输出部分获取密钥的最新版本?