您的位置 首页 java

Python100天23:变量作用域NameError

变量的作用域

 def greet():
    name = 'Steve'   # 局部变量
    print('Hello ', name)
  

通常,在代码块中定义的变量只能在该块中可用。它无法访问代码块范围之外 的变更。这样的变量称为 局部变量 形式参数 标识符也表现为局部变量。

上面的的例子将强调这一点。尝试访问范围之外的局部变量将引发 NameError

 
def greet(name):
    print('Hello ', name)  
Python100天23:变量作用域NameError

此时我们优先使用的是上图所示的变量name

形式参数

 def hello(name):
    name = 'Steve'
    print('Hello ', name)

hello("abc")  

输出 Hello Steve

Python100天23:变量作用域NameError

  • 如上图我们在定义函数 hello的时候定义了一个参数name那么这个name是可以被函数内部代码使用的。

  • 我们之前函数调用,明明传的是 “abc” ,为什么最后显示的结果是 Steve
 hello(" abc ")  
  • 代码稍微调整一下,删除 name = “Steve”
 def hello(name):
    print('Hello ', name)

hello(" abc ")  
Python100天23:变量作用域NameError

此时 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()  
Python100天23:变量作用域NameError

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是在两个不同的代码块中定义 的局部变量。各自有自己的变量作用哉,属于代码块级别的。

文章来源:智云一二三科技

文章标题:Python100天23:变量作用域NameError

文章地址:https://www.zhihuclub.com/192501.shtml

关于作者: 智云科技

热门文章

网站地图