-
2019-12-02 14:51:02更多相关内容
-
C++中的extern声明变量详解
2021-01-20 06:05:541、声明全局变量 2、声明函数 今天我们只谈extern,什么const、static之类等等与之相关或不相关的一律忽略,下面就分别对以上两种情况一一讲解 声明和定义 既然提到extern声明变量,那我们就必须搞清楚声明和定义的... -
从汇编程序中访问C程序变量
2021-01-19 22:56:57在C程序中声明的全局变量可以被汇编程序通过地址间接访问,具体访问方法如下。 ·使用IMPORT伪指令声明该全局变量。 ·使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在 程序的数据... -
C语言中跨文件的全局变量
2021-05-20 13:36:57声明:突然看到这篇文章,发现了c语言中使用全局变量的错误,特转之。首先看一段代码(https://gist.github.com/3760736)func.cintbuf=0;voidfunc(){buf=2;/* Do something else */}view raw func.c This Gistbrought...声明:突然看到这篇文章,发现了c语言中使用全局变量的错误,特转之。
首先看一段代码(https://gist.github.com/3760736)
func.c
int
buf
=
0
;
void
func
()
{
buf
=
2
;
/* Do something else */
}
view raw func.c This Gist brought to you by GitHub.
main.c
#include
int
buf
;
void
func
();
int
main
()
{
buf
=
1
;
func
();
printf
(
"%d
\n
"
,
buf
);
return
0
;
}
view raw main.c This Gist brought to you by GitHub.
编译两个文件,输出的结果是怎样的呢?一眼看上去,可能会输出1,因为两个全局变量buf在不同文件中,又没有extern声明,显然是两个嘛。然而实际上它的运行结果却是2,这说明了这两个文件中引用到的其实是一个变量!
这是为什么呢?原因是在编译时,C语言编译器将全局符号标记为strong和weak两类:
函数和初始化的全局符号被标记为strong
未初始化的全局符号被标记为weak
连接时,连接器对多重定义的全局符号的解析原则如下:
同一个符号不允许有多个strong定义;
假如一个符号有一个strong定义和多个weak定义,那么采用该符号的strong定义;
假如一个符号有多个weak定义,那么选取任意一个weak定义
由于两个变量一个初始化了,一个没有初始化,所以一个是strong,一个是weak,所以连接器在符号解析时会把他们当成一个。
如果我们把main.c中的buf也初始化了:
#include
int
buf
=
0
;
void
func
();
int
main
()
{
buf
=
1
;
func
();
printf
(
"%d
\n
"
,
buf
);
return
0
;
}
view raw func.c This Gist brought to you by GitHub.
再次编译就会发现
duplicate symbol _buf in:
/var/folders/44/_cc501qx1jd1p5bfrjbk6b100000gn/T//ccZ87C6g.o
/var/folders/44/_cc501qx1jd1p5bfrjbk6b100000gn/T//ccZlES8n.o
ld: 1 duplicate symbol for architecture x86_64
collect2: ld returned 1 exit status
这是因为两个全局变量都是strong的。
-
python 全局变量
2020-12-10 23:06:00理解的都没问题。...比如:a = 1def test():a = 3print(a)test()函数内声明了局部变量 a ,在打印中使用,在本地环境中命中,因此使用的是 3。也许你会问这个知识点我早就知道了,这和本问题有什么关...理解的都没问题。但我想聊聊出现这种情况的原因。在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是 LGB (不考虑闭包情况)即local本地,global全局,builtin内建。比如:
a = 1
def test():
a = 3
print(a)
test()
函数内声明了局部变量 a ,在打印中使用,在本地环境中命中,因此使用的是 3。
也许你会问这个知识点我早就知道了,这和本问题有什么关系呢?
有的,难道你不觉得奇怪吗?报错是变量未初始化,而不是变量未定义。
题目中函数内 c= c+1 就已经表明了声明的变量 c 是属于局部变量的。 按理说,先执行赋值语句右侧,而此时 c 并没有声明,应该在全局环境命中才对啊。所以想象中的结果应该是局部变量 c = 2 而全局变量的 c 保持原值。
但是,这只都是想当然。讲了这么多其实我是想引出,python虽然是动态语句,但它还是会对代码做扫描工作的,会有收集有用的静态信息。函数的应该信息会放在 code 对象中,里面的信息就包含了局部变量名称的集合,可以通过 co_varnames 得到,如下:
c = 1
def test():
c= c+1
a = 3 # 另一个局部变量
print(c)
print(test.__code__.co_varnames) # ('c', 'a')
因此,函数test在执行前,变量 c 就已经被声明在局部变量环境中了,而不是我们自认为的当赋值语句运行后才会在局部变量里。于是,这就导致了报错信息是变量未初始化而不是变量未定义。
====== 分割线 =========
题主评论要求:
关于变量的初始化,定义,创建这三者关系,能帮忙疏导一下理解吗?
这三个意思基本差不多,没必要分得太开。把变量环境理解成一个字典 name_env = dict() 其实就很好理解了(事实上python底层也确实是这样处理的)。对于在这个环境内要创建一个名为 a 的变量,就可以是 name_env['a'] = value 的形式了。
这个过程也就是赋值语句形如 a = value 时会调用赋值的指令 STORE_NAME 。我们看一下这个赋值过程你就理解了。
这部分代码在 ceval.c 中,详见 ceval.c
TARGET(STORE_NAME) {
PyObject *name = GETITEM(names, oparg);
PyObject *v = POP();
PyObject *ns = f->f_locals;
int err;
if (ns == NULL) {
PyErr_Format(PyExc_SystemError,
"no locals found when storing %R", name);
Py_DECREF(v);
goto error;
}
if (PyDict_CheckExact(ns))
err = PyDict_SetItem(ns, name, v);
else
err = PyObject_SetItem(ns, name, v);
Py_DECREF(v);
if (err != 0)
goto error;
DISPATCH();
}
代码不多,可以逐个分析下,第一行获得的 name 就是赋值语句 a = value 的 a,a以python类型 str 形式存在。第二行 v 从栈中获取,也就是 value 的值。第三行 ns 是从帧对象中获得局部变量环境(大多数情况下是个字典类型,如果帧环境不在函数或类中,取得的是全局变量环境)。PyDict_SetItem(ns, name, v); 和 PyObject_SetItem(ns, name, v); 就可以理解为 ns[name] = v 和 setattr(ns, name, v) 了,创建过程就是这样了。
变量究竟是创建还是初始化还是覆盖已有的变量值,其实底层并不关心。
回到本地中,本地变量的符号表会保存在静态信息里面,我猜测搜索变量时有优先去静态信息中得到信息,来更快的知道变量应该是在局部还是全局中查找吧。
-
Python中的全局变量
2020-07-11 08:54:52In this tutorial, We will look into Python Global Variables. We will learn how to define a global variable and then how to access them in a ... 我们将学习如何定义全局变量,然后如何在函数中访问它们。...In this tutorial, We will look into Python Global Variables. We will learn how to define a global variable and then how to access them in a function.
在本教程中,我们将研究Python全局变量。 我们将学习如何定义全局变量,然后如何在函数中访问它们。
Python中的全局变量 (Global Variables in Python)
Global Variables are defined outside a function. We can access a global variable in all parts of the Python program.
全局变量在函数外部定义。 我们可以在Python程序的所有部分中访问全局变量。
Python全局变量示例 (Python Global Variables Example)
Let’s look at a simple example to declare a global variable. Then we will use this global variable in a function.
让我们看一个声明全局变量的简单示例。 然后,我们将在函数中使用此全局变量。
website = "JournalDev.com" def return_website(): return website print(f'My favorite website is {return_website()}')
Output:
输出:
My favorite website is JournalDev.com
The variable “website” is defined in the program, outside of a function. So, it becomes a global variable.
变量“网站”在程序中的函数外部定义。 因此,它成为一个全局变量。
使用全局关键字访问全局变量 (Using global keyword to access global variable)
If there is a variable defined inside a function with the same name, then we have to use global keyword to access the global variable. Otherwise, the local variable value will be used.
如果在函数内部定义了一个具有相同名称的变量,那么我们必须使用global关键字来访问全局变量。 否则,将使用局部变量值。
Let’s look at a quick example to use the global keyword to access global variables.
让我们看一个使用global关键字访问全局变量的简单示例。
website = "JournalDev.com" def print_website(): global website print(f'My favorite website is {website}') website = 'Wikipedia.com' print(f'My favorite website is {website}') print_website()
Output:
输出:
My favorite website is JournalDev.com My favorite website is Wikipedia.com
If we don’t use the global keyword, the program will throw error message “UnboundLocalError: local variable referenced before assignment”.
如果我们不使用global关键字,则程序将抛出错误消息“ UnboundLocalError:分配前引用的本地变量”。
The best practice is to avoid using the same name as the global variable and stay away from the name conflicts.
最佳做法是避免使用与全局变量相同的名称,并避免名称冲突。
Python globals()函数快速入门 (Quick word on Python globals() function)
Python globals() function return a dictionary representing the current global symbol table. This dictionary contains the global variables name and its values. We can use this function to get quick information on all the global variables.
Python globals()函数返回一个表示当前全局符号表的字典 。 该词典包含全局变量名称及其值。 我们可以使用此功能来获取有关所有全局变量的快速信息。
Python program maintains program information in symbol tables.
Python程序在符号表中维护程序信息。
There are two types of symbol tables:
符号表有两种类型:
- Local Symbol Table – stores information related to the local scope of the program. 本地符号表 –存储与程序的本地范围有关的信息。
- Global Symbol Table – stores information related to global scope of the program. 全局符号表 –存储与程序的全局范围有关的信息。
Python symbol table contains details about variable names, methods, classes, etc.
Python符号表包含有关变量名称,方法, 类等的详细信息。
Python globals() function doesn’t accept any arguments.
Python globals()函数不接受任何参数。
print(globals())
Output:
输出:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None}
It also prints the python script from where this function is called.
它还会在调用此函数的位置打印python脚本。
Let’s see the output if the same function is called from the Python interpreter.
让我们看看是否从Python解释器调用了相同的函数的输出。
$ python3.7 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print(globals()) {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>} >>>
This time there is no __file__ attribute in the output.
这次输出中没有__file__属性。
globals()字典中的全局变量 (Global Variables in globals() dictionary)
As we mentioned earlier that the global symbol table contains information about the global variables.
如前所述,全局符号表包含有关全局变量的信息。
Let’s see this with a simple example.
让我们用一个简单的例子来看一下。
name = 'Pankaj' print(globals())
Output:
输出:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None, 'name': 'Pankaj'}
The global symbol dictionary contains the ‘name’ variable too.
全局符号字典也包含“名称”变量。
One of the features of globals() is that we can modify the variables in the global dictionary. Since it’s a dictionary, we can get the value of a specific key too.
globals()的功能之一是我们可以修改全局字典中的变量。 由于它是字典,因此我们也可以获取特定键的值。
globals()['name'] = 'David' print(globals()['name'])
Output:
David
输出:
David
Let’s see if globals() contains local scope variables or not. For this, let’s define a function and some variables inside it.
让我们看看globals()是否包含局部作用域变量。 为此,让我们定义一个函数和其中的一些变量。
def fx(): local = '' global gl gl = 'Global' fx() # calling fx() to set the variables print(globals()) print(globals()['gl'])
Output:
输出:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None, 'name': 'David', 'fx': <function fx at 0x10a9331e0>, 'gl': 'Global'} Global
The ‘gl’ variable is part of the global dictionary because its scope is global. Whereas, ‘local’ variable is not part of the global dictionary because of having local scope.
'gl'变量是全局词典的一部分,因为它的范围是全局的。 而“局部”变量由于具有局部范围,因此不属于全局词典。
结论 (Conclusion)
Python global variables are very easy to define and use. The globals() function returns the global variables and it can be used in debugging the code. We can use it to identify the global scope variables and functions available to the program. We can also modify the global variable data, but that is not advisable and mostly not required in normal programs.
Python全局变量非常易于定义和使用。 globals()函数返回全局变量,可用于调试代码。 我们可以使用它来识别程序可用的全局范围变量和函数。 我们还可以修改全局变量数据,但这是不可取的,并且在正常程序中通常不是必需的。
GitHub Repository. GitHub存储库中检出完整的python脚本和更多Python示例。Reference: Official Documentation
参考: 官方文档
翻译自: https://www.journaldev.com/22870/global-variables-python
-
python中全局变量和局部变量的使用
2021-10-04 22:51:512、全局变量在函数外部声明,作用域是声明之后的,如果在声明前被调用,则会报错,如下: def showglobal(): print(a) showglobal() a= "我是全局变量" print(a) 运行结果: Traceback (most recent call last):... -
全局变量与强符号和弱符号
2016-10-18 15:29:06全局变量与强符号和弱符号 -
c语言中const修饰的局部变量和全局变量存放在哪个区域
2021-11-24 23:06:46c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中(const全局有的编译器直接当立即数存在ROM中),第一次使用时为其分配内存,在程序结束时释放。 而const局部变量(局部变量就是在函数中定义的... -
在SQL Server中全局变量名称
2018-03-13 11:20:39在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值。全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数。下表就是SQL Server中一些常用的全局变量。 --------------------------- ... -
全局变量存放在哪里?
2021-02-12 18:46:16如果一个JVM是用C/C++实现的,那么在实现层里用到的“全局变量”就放在实现语言的全局变量所存储的位置,跟Java/JVM自身没关系。题主说的“全局变量”多半实际想问的是Java层面的“静态变量”。下面再说。在Java层面... -
全局变量放在头文件中
2020-09-17 11:52:09今天遇到一个坑,在VS上进行多文件的编译运行的时候,在头文件中定义了全局变量a,该头文件被类的实现CPP和主函数所在的CPP包含且声明extern int a。但是在链接的时候报多重定义的错误。网上看了下,这篇文章给出了... -
Python:使用全局变量的语法无效
2020-12-10 12:49:23首先,我必须告诉你,我对编码是完全陌生的...为了让计算机知道函数“main”是因为接收到无效的函数而运行,还是因为它是第一次运行,我尝试使用一个名为“check”的全局变量。开始时,check设置为1,因此计算机在请... -
Matlab/Simulink中的静态变量和全局变量
2020-04-12 14:24:18Matlab/Simulink中的静态变量和全局变量1、静态变量(persistent)2、全局变量(global)1)Matlab中使用全局变量2)Simulink中使用全局变量功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与... -
关于C语言程序中全局变量的定义和初始化问题
2020-08-18 15:01:05C语言中头文件定义变量 在c语言的头文件中,经常使用 `#ifndef a_h #define a_h #endif /* a_h */或者是#program once` 这种形式来保证一个头文件不会被重复引用,注意,这里指的是不会被一个C源文件引用,因为: ... -
EDA/PLD中的从汇编程序中访问C程序变量
2020-11-13 03:41:38在C程序中声明的全局变量可以被汇编程序通过地址间接访问,具体访问方法如下。 ·使用IMPORT伪指令声明该全局变量。 ·使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在 程序的数据... -
c语言中的static关键字,以及局部变量,静态局部变量,全局变量与静态全局变量
2019-04-07 22:09:07静态全局变量,作用域仅限于被定义的文件中,其他文件即使用extern声明也没法使用它。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern。... -
T-SQL语言中局部变量(@)和全局变量(@@)
2021-01-04 11:49:08局部变量和全局变量 T-SQL局部变量 局部变量的作用范围仅限制在程序内部。***局部变量被引用时要在其名称前加上标志“@”,***而且必须先用DECLARE命令定义后才可以使用。 局部变量的声明,定义局部变量的语法形式... -
C++ 全局变量被自身文件/项目内其他文件/动态链接库(DLL)之外文件使用
2022-03-22 01:29:54全局变量的使用一、全局变量的定义和基础使用二、全局变量被其它文件使用三、全局变量在动态链接库中定义,被外部文件使用 一、全局变量的定义和基础使用 全局变量一般定义在一个.cpp文件的头部, 供所在文件乃至其它... -
全局变量可不可以定义在可被多个.c文件包含的头文件中?
2019-08-26 17:30:32另外一点,可以在不同的c文件中声明同名的全局变量,前提是其中只能有一个c文件中对此变量赋值,此时链接不会出错。 extern和static不能同时修饰同一变量。 链接规范,每个c/c++的定义都有链接规范(linkage)的... -
变量名前加$符号就可以声明全局变量了
2012-11-02 18:09:53全局变量: 局部变量和全局变量的区别在于局部变量只能被所在的脚本访问,而全局变量能被所有的脚本访问. 在变量名前加$符号就可以声明全局变量了. -
php函数相关(3):函数体中局部变量改变全局变量
2017-11-22 17:01:081、引用传值 ... function aaa(&$num){ // 注意,此时的参数前有个 “&” 符号,是地址符号,传递的则不是参数对应的值,二是参数指向的地址了; return $num += 1; } echo $a; //18 -
c++头文件的使用和多个文件中如何共用一个全局变量
2019-03-27 21:57:01头文件只是用来声明的,不参与编译,#include “1.h” 只是把1.h里的代码给复制到这个源文件里来,建议还是好好...1)不管变量还是函数先声明 或者直接定义才能使用,声明能声明n次,同一个作用域里面 定义只能定义... -
局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
2018-05-11 16:23:48下面有几种网上的理解,我整理一下:一: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员... -
c学习--不同c文件中的同名全局变量及同名函数53
2021-09-03 09:52:06如果在不同的c文件中定义了同名的全局变量,则... (2) 对于没有初始化的全局变量,因为不知道是定义还是声明,所以要在扫描完所有代码之后才能决定,这个时候编译器会读符号表,然后看哪些变量没有分配空间. ... -
外部变量与全局变量
2017-10-14 14:18:25在一个头文件a.h中定义一些变量x,在其他.c文件中(b.c,c.c)要用到,在两个*.c中包含a.h以后, 编译时总是提示error:multiple definition of x。 解决思路: 当时本想采用extern变量的方法,但考虑到会使用... -
VS2017 C++全局变量/函数的使用
2020-08-26 21:02:40假设有三个源文件分别是A.h、B.cpp、C.cpp。 A.h是头文件,其中声明了三个变量var1、var2、var3。...在编译时,编译能够通过,但链接时出了问题,出现”error LNK1169: 找到一个或多个多重定义的符号“的错误。 -
C语言中全局变量的定义及重复包含问题
2017-11-28 10:58:41C语言中一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件中,同时在与之对应的fileName.h文件中进行 extern int A声明。当一个全局变量int A仅在fileName.c文件中定义而未在相对应的头文件... -
全局变量能否放在头文件中定义
2018-05-29 19:42:04今天遇到一个坑,在VS上进行多文件的编译运行的时候,在头文件中定义了全局变量a,该头文件被类的实现CPP和主函数所在的CPP包含且声明extern int a。但是在链接的时候报多重定义的错误。网上看了下,这篇文章给出了... -
全局变量不能定义在“被多个.c文件引用的.h文件”中
2018-05-24 11:17:46转自: https://blog.csdn.net/basstal/article/details/52275191全局变量global定义在头文件中,因为所有定义预设为外部链接,所以在头文件被.c文件包含以后,等于有两个或更多同等定义的global存在于不同的翻译...