首页 > 解决方案 > 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.函数之前,因为我没有将它们设为私有或任何东西,这也不是一个对象。

标签: namespaces

解决方案


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

def setname(name):
    global myvar
    myvar = name

因为您没有这样做,所以当 Python 解释器进入setname它时,它创建了一个新myvar变量,该变量在计算表达式时是函数的本地变量myvar = name。一旦该函数返回,该本地myvar就被有效地删除了。全球myvar没有受到影响。

global现在,Python 允许您在不使用关键字的情况下读取全局变量。您的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的文档。简短而简单的答案是有两个原因:

  1. 当您导入一个模块时,Python 会实例化一个模块对象,将模块的内容加载到其中,然后提供一个变量来访问该对象。该变量的本地范围仅限于导入它的文件。该变量的名称是您导入的模块的名称,除非您更改它。导入模块中的函数是该模块对象的方法;因此,为什么需要使用pythontest来调用这些函数。这就引出了第二点。
  2. 如果您不想导入整个模块,则必须选择。首先,您可以从模块中导入特定项目。例如,如果您只想导入函数,可以使用以下语法:
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 中的一切都是对象,甚至导入模块、函数和变量。


推荐阅读