添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

__main__方法作为Python编程环境的程序入口,可以定义一些变量,这些变量默认为全局变量,可供其他方法使用。但是使用的过程需要注意一些事项,否则会出现报错。

__main__方法中的变量

import argparse
# TracelessLe注:代码示例,不可直接执行
def test_fun1():
    print("pathA: ", pathA)
if __name__ == "__main__":
	parser = argparse.ArgumentParser(
        'Options for test.')
    parser.add_argument("--pathA", type=str, required=True,
                        help="the path of results")  # 指定路径
    args = parser.parse_args()
    pathA = args.pathA
	test_fun1()  # 调用test_fun1()方法

在上述代码中,pathA 在__main__方法中定义,默认为全局(global)变量,可以供test_fun1()方法调用,能够正常打印。

尝试修改__main__方法中的变量

import argparse
import os
# TracelessLe注:代码示例,不可直接执行
def test_fun2():
    if pathA.endswith('/'):
    	pathA = pathA[:-1]  #  此处尝试修改pathA,会报错
    pathA = os.path.basename(pathA)
    print("pathA: ", pathA)
if __name__ == "__main__":
	parser = argparse.ArgumentParser(
        'Options for test.')
    parser.add_argument("--pathA", type=str, required=True,
                        help="the path of results")  # 指定路径
    args = parser.parse_args()
    pathA = args.pathA
	test_fun2()  # 调用test_fun2()方法

在上述代码中,pathA 在__main__方法中定义,默认为全局(global)变量(如果其它方法调用pathA时不加global声明的话pathA可视为常量),但是在test_fun2()方法中,尝试对pathA变量进行修改后赋值,此时pathA会被解释器解释为test_fun2方法的局部变量。因此在运行过程中会遇到下面的报错:

Traceback (most recent call last):
File "test.py", line 12, in
test_fun2()
File "test.py", line 12, in test_fun2
if pathA.endswith('/'):
UnboundLocalError: local variable 'pathA' referenced before assignment

正确使用__main__方法中的变量

import argparse
import os
# TracelessLe注:代码示例,不可直接执行
def test_fun3():
   	if pathA.endswith('/'):
        pathA_name = os.path.basename(pathA[:-1])  # 使用切片,不会改变pathA变量本身
    else:
        pathA_name = os.path.basename(pathA)
    print("pathA_name: ", pathA_name )
if __name__ == "__main__":
	parser = argparse.ArgumentParser(
        'Options for test.')
    parser.add_argument("--pathA", type=str, required=True,
                        help="the path of results")  # 指定路径
    args = parser.parse_args()
    pathA = args.pathA
	test_fun3()  # 调用test_fun3()方法

在上述代码中,pathA 在__main__方法中定义,默认为全局(global)变量,在test_fun3()方法中,尝试使用新的局部变量存储pathA的切片,此时作为全局变量的pathA不变,因此程序可以正常运行。或者在test_fun2方法中第一次调用pathA之前声明“global pathA”后再使用,如下所示:

>>> if __name__ == "__main__": ... pathA = "aaa" ... >>> def test(): ... print(pathA) ... pathA = "xxx" ... print(pathA) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test UnboundLocalError: local variable 'pathA' referenced before assignment >>> def test2(): ... print(pathA) ... global pathA ... pathA = "xxx" ... print(pathA) ... File "<stdin>", line 3 SyntaxError: name 'pathA' is used prior to global declaration >>> def test3(): ... global pathA ... print(pathA) ... pathA = "xxx" ... print(pathA) ... >>> test3() >>> pathA 'xxx'

除了在__main__中定义全局变量外,还可以在文件开头使用global显式声明全局变量。不过通常不这么做。一般仅会在文件头使用全大写变量名定义全局常量。

本文为原创文章,独家发布在blog.csdn.net/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com
在这里插入图片描述

[1] python中定义全局变量的方法 - 编程语言 - 亿速云
[2] main — Top-level code environment — Python 3.10.3 documentation

前言__main__方法作为Python编程环境的程序入口,可以定义一些变量,这些变量默认为全局变量,可供其他方法使用。但是使用的过程需要注意一些事项,否则会出现报错。__main__方法中的变量import argparse# TracelessLe注:代码示例,不可直接执行def test_fun1(): print("pathA: ", pathA)if __name__ == "__main__": parser = argparse.ArgumentParser( 字符串插值x = y +'jain' 浮点格式和字符串格式(值:width.precision) print('我叫rishabh {last},我有{money:1.3f}'。format(last ='jain',money = 50.3145)) 从(未来)导入 global 标志实际上是为了提示 python 解释器,表明被其修饰的变量是全局变量。这样解释器就可以从当前空间 (current scope) 读写相应变量了。 Python 的全局变量是模块 (module) 级别的 每个 python 函数拥有对应的 __globals__ 字典,该字典与函数所属模块的 __dict__ 字典完全相同。函数的全局变量也会从这个字典获取 注:上面三句话的意思就是,python 解释器发现函数的某个变量被 global 关键字修饰,就去函数的 __globals__ 字典变量寻找(因为 python 函数也是一等对象);同 那么这一行代码有什么具体的作用呢,不加的话会对我们的结果造成影响吗? __name__ 首先对于用双下划线开头且结尾的变量,在 Python 被称为内置变量,除了 __name__,我们常见的还有 __init__,__dict__ 等等.那么有多少内置变量呢?我们可以通过下面在交互界面输入下面的命令,查看 Python 全部内置变量和内置函数 >>> dir(__builtins__) 很多python的初学者可能都会遇到一个问题:__name__是什么意思? 在刚开始学习python的时候,我们总会看到这样一句代码: if __name__ == “__main__”: 一开始我以为这句代码的意思和C语言main函数一样,程序从这里开始执行,但后来经过查询资料发现,两者并不完全相同,这里做一些解释: __name__是一个变量,前后加了双下划线是因为这是系统定义的名字(python系统变量都是双下划綫开头结尾),普通变量使用这种命名方式; python有很多模块,这些模块是可以独立运行的(这一点与C语言和C
python学习:解决如何在函数内处理数据而不影响原列表 关于一个如何在函数内修改三阶矩阵。 在python里,如果想要定义一个函数,把列表当c++里的形参传进去,显然是不可能的。在python里,只存在引用传递和值传递,当传进去的是一个值的时候,就是值传递,当传进去是一个列表或者是字典的时候,就是引用传递。 引用传递到函数内操作的话,在函数外的列表或者是字典也会随之改变。看来python也有不方...
1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼,你是小明(__name__ == '小明');在你自己眼,你是你自己(__name__ == '__main__')。 if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模...
variable_name = variable_value 例如x = 5 这个操作过程就是赋值,意思就是把整型数字5赋值给了变量x,用等号来连接变量名和值。赋值之后就可以在表达式使用x这个变量了,它代表的含义为整型数字5。 变量的分为局部作用域、...
估计很多人跟我一样初学python看代码的时候先找一下main()方法,从main往下看。但事实上python是没有你理解的“main()”方法的。言归正传 if __name__ == "__main__":可以看成是python程序的入口,就像javamain()方法,但不完全正确。 事实上python程序是从上而下逐行运行的,在.py文件,除了def后定义函数外的代码都会被认为是...
python是一种解释型脚本语言,和C/C++语言不同,C/C++程序从main函数开始执行,python程序从开始到结尾顺序执行。先总结下pythonmain函数的作用:让模块(函数)可以自己单独执行(调试),相当于构造了调用其它函数的入口,这就类似于C/C++里面的main函数了。 一方面:我们想要自己单独执行(调试) 这里我们实际调试一下(假设这个文件是test.py): #t...
Python定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数,那么就还有额外的成员变量(self)空间。那么,如果在实际操作,想把这几种不同的变量空间做一个分离的话,有没有办法呢? 读取和修改局部变量 首先来看一下局部变量的读取,一般有locals()、vars()和sys._getframe(0).f_code...
__name__ 是一个特殊变量,用于表示当前模块的名称。在一个 Python 文件,当它被直接运行时,__name__ 的值为 "__main__",当它被作为模块导入时,__name__ 的值为模块的名称。可以使用 __name__ 来判断当前模块是被导入还是直接运行。例如: if __name__ == "__main__": # 当前模块被直接运行 else: # 当前模块被导入 这样可以在模块被导入时不执行一些特定的代码,只在模块被直接运行时执行。
blaton: 请问这个什么意思?我装了tensorrt啊 File "C:\Users\XZB\Anaconda3\envs\pytorch2\lib\site-packages\tensorrt\__init__.py", line 133, in <module> from .tensorrt import * ModuleNotFoundError: No module named 'tensorrt.tensorrt'