变量的作用域
def greet():
name = 'Steve' # 局部变量
print('Hello ', name)
通常,在代码块中定义的变量只能在该块中可用。它无法访问代码块范围之外 的变更。这样的变量称为 局部变量 。 形式参数 标识符也表现为局部变量。
上面的的例子将强调这一点。尝试访问范围之外的局部变量将引发 NameError
def greet(name):
print('Hello ', name)
此时我们优先使用的是上图所示的变量name
形式参数
def hello(name):
name = 'Steve'
print('Hello ', name)
hello("abc")
输出 Hello Steve
- 如上图我们在定义函数 hello的时候定义了一个参数name那么这个name是可以被函数内部代码使用的。
- 我们之前函数调用,明明传的是 “abc” ,为什么最后显示的结果是 Steve
hello(" abc ")
- 代码稍微调整一下,删除 name = “Steve”
def hello(name):
print('Hello ', name)
hello(" abc ")
此时 def hello(name) 这个name就是一个形式参数,
- 当我们使用 hello(” abc “) 后,name这个形式参数的值就是 “abc”
回到之前 的问题 加了 name =”Steve” 这段后,name的值在函数内部变成了Steve。因此最后的结果就不是最初始函数调用 传递的值 “abc”了。
因为你在函数内部改变了形式参数 name的值。
没有形式参数,也没有局部变量,会发生什么?
def hello( ):
print('Hello ', name)
hello( )
NameError: name ‘name’ is not defined
大家如果是用 Pycharm 编写程序,这种找不到 变量的问题,工具已经给了我们提示了。观察一下,name这个下面有个 红色 的 ~~~ 波浪线,表示这个变更访问是有问题的。
把鼠标放在这个红色波浪线的位置,工具会提示一段化 unresolved reference name,无法解析 的引用 “name” 就已经告诉你了,变量name工具无法找到它的定义。
函数内部访问外部变量
- 访问外部变量
name='John'
def greet():
print ("Hello ", name)
greet()
- 内部,外部都有同名变量。优先访问局部变量
name = 'Steve'
def greet():
name = 'Bill'
print('Hello ', name)
图中第2处的变量名是在内部定义的。因此pirnt优先使用内部的变量
- 明确的表示要使用外部变量使用 global 变量名
name = 'Steve'
def greet():
global name
name = 'Bill'
print('Hello ', name)
greet()
global name表示在函数内部要明确的使用外部 的变更 name,也就是 (1)处标识的变更name
由于 Python 语法的扯淡性,导致也这个global的出现。
总之Python的变量使用优先使用靠近用它的地方 局部变量,形式参数 僵尸变量
其他语言 Java 就贿这个困扰的问题了。
public class VarScope {
public static void main(String[] args) {
String abc = "abc";
int a = 1;
int b = 2;
if (a < b) {
String abc = "123";
}
}
}
变量 abc一旦定义后,方面内部是不能在重复定义 的。
public class VarScope {
public static void main(String[] args) {
String abc = "abc";
int a = 1;
int b = 2;
if (a < b) {
String def = "123";
} else {
String def = "123";
}
}
}
变量def 是可以重复定义 的,因为def是在两个不同的代码块中定义 的局部变量。各自有自己的变量作用哉,属于代码块级别的。