
这段代码说明了在函数中声明没加var关键字的变量时,会出现什么结果。
分两种不同的情况:
1、如果函数内没有同名的局部变量覆盖“无var变量”,那么它就是个全局变量,在函数外部也可以访问到它;
2、如果函数内有同名局部变量覆盖“无var变量”,那么它就会被同名局部变量覆盖了(但此时如果你在我外面调用这个变量,也不会报undefined错误)。
全局变量,局部变量
函数内部定义的变量为局部变量,程序中函数外部定义的为全局变量,
name = '小明'
def n():
name ='小红'
print(name)
n() # 小红
print(name) # 小明
names=['x','y','z']
def change():
names=['a','b','c']
print(names)
change()
print(names)
# ['a', 'b', 'c']
# ['x', 'y', 'z']
names=['x','y','z']
def change():
del names[2]
print(names)
change()
print(names)
# ['x', 'y']
# ['x', 'y']
函数内部再定义函数就是嵌套函数,函数定义之后要执行就必须调用。
def func1():
print('小明')
def func2():
print('小红')
func1() #小明
def func1():
print('小明')
def func2():
print('小红')
func2() # 调用
func1()
# 小明
# 小红
1、内层函数引用变量一层一层外找。
age=19
def func1():
age=20
print(age)
def func2():
age = 21
print(age)
func2()
func1()
# 20
# 21
age=19
def func1():
age=20
print(age)
def func2():
print(age)
func2()
func1()
# 20
# 20
2、
age=19
def func1():
def func2():
print(age)
age=20 # 在函数func1已经定义了,func2()执行时已经存在。
func2()
func1()
# 20
3、
age=19
def func1():
def func2():
print(age)
func2()
age = 20 # 报错
func1()
age=19
def func1():
global age # 添加global之后,func2执行age19,
# 更改全局变量age更改全局变量age
def func2():
print(age)
func2()
age = 20
func1() # 19
4、
python中一个函数就是一个作用域,局部变量放置在其作用域中
代码定义完成后,作用域已经生成,作用域链向上查找,函数名是可以当成返回值的!
age=19
def func1():
global age
def func2():
print(age)
age = 20
func2()
func1()
print(age)
# 20
# 20
age=19
def func1():
age=73
def func2():
print(age)
return func2
val=func1()
val()
# 73
对嵌套函数而言,每当外部函数被调用时,都将重新定义内部的函数,并返回内部的函数对象。当内部函数执行时,可以访问这个来自外部函数局部作用域的变量。
def func(num):
def func2(num2):
return num * num2
return func2
x=func(3) # 返回func2,函数对象,没有执行func2,加括号时执行。
print(x(2)) # x(2)执行时,依然可以访问到外部函数func定义的作用域里的变量num=3
# 6
y=func(5)
print(y(6))
# 30
函数func每次被调用时都会重新定义func2,并返回func2函数对象并包裹func定义的作用域。
嵌套函数func2在外部函数之外调用时,它依然可以访问到作用域之内的局部变量。
这段代码说明了在函数中声明没加var关键字的变量时,会出现什么结果。分两种不同的情况:1、如果函数内没有同名的局部变量覆盖“无var变量”,那么它就是个全局变量,在函数外部也可以访问到它;2、如果函数内有同名局部变量覆盖“无var变量”,那么它就会被同名局部变量覆盖了(但此时如果你在我外面调用这个变量,也不会报undefined错误)。转载于:https://www.cnblogs.com/macliu/p/5341707.html
可以利用static在不同的文件中定义同名函数和同名变量,而不用担心命名冲突
static变量存放在静态存储区,变量只有一次初始化
static修饰全局变量时改变其使用范围
- 全局变量
- 全局变量默认初始化为0,字符型变量为空字符’’
- 定义在函数外,可被本文件及其他文件的函数使用(外部链接),其他文件使用时序用extern声明
- 生命周期和程序运行周期一样
- 不同文件的全局变量不可以重名
- 局部变量
- 如果没有赋初值,内容为随机
- 如果定义在符合语句内,只在复合语句中有效
- 同一文件中全局变量和局部变量可以同名,在局部变量作用域内,全局变量不起作用
- 静态全局变量
- 静态全局变量的值只初始化一次,默认初始化为0,字符型变量为空字符’’
- 作用域限制在本文件内(内部链接),因此不同文件的静态全局变量可以重名
- 生命周期和程序运行周期样
- 存储在静态区
- 静态局部变量
- 静态局部变量在函数第一次调用的时候构造,只初始化一次,默认初始化为0,字符型为空字符
- 作用域为定义的函数内
- 生命周期和程序运行周期一样
- 存储在静态区
- 全局函数
- c语言中的函数默认都是全局的,使用static关键字可以将函数声明为静态,静态函数只能在本文件中使用
- 静态函数
- 静态函数只能在本文件中使用,因此不同文件的静态函数可以重名
- 总结