常见编程语言C++、Python、Js中局部变量作用域的差异

文章目录

  • 前言
  • 变量作用域
  • C++
  • Java
  • Go
  • Python
  • Lua
  • JavaScript
  • 总结
  • 前言

    编程语言这东西,就得多练,不管之前你掌握的多么扎实,只要是一段时间不使用,再次拿起来时还是很生疏,就比如从入行就写的lua脚本,连续使用了6年多,刚放下1年再写就觉得很陌生,还有之前写了很久的Python,最近在使用时也记不清变量的作用域了,干脆把我常用的几种语言的变量作用域整理到一起好了,便于自己查阅,首先来说我不是编写使用手册,没必要面面俱到,一切为了实用,像成员变量、静态变量几乎没什么疑问就不去写了,本文单独整理一下局部变量。

    变量作用域

    像C/C++、Java这种编译型语言来说很类似,变量在定义它的临近区域内有效,而依赖于解释的脚本语言则有着细微的差别,依赖于语言各有侧重,下面举例说明吧。

    C++

    void example() {
        int localVar = 5;  // 局部变量
        if (int val = getval(); val > 0) {
            int blockVar = 3;  // 块作用域
            std::cout << val;  // 访问 val
        }
        // blockVar 在此处不可访问
    }
    

    在C++中变量在定义它的大括号之内都有效,像 iffor 等语句中定义的变量,在它们紧跟着的大括号内有效,例如例子中的 var 变量的作用域。

    Java

    public class Example {
    
        public static void main(String[] args) {
            int localVar = 5;  // 局部变量,作用域为整个方法
    
            for (int i = 0; i < 2; i++) {
                int blockVar = 3;
                System.out.println("Block variable: " + blockVar);
                System.out.println("i: " + i);
            }
    
            // blockVar、i 在此处不可访问,因为它仅在 for 块中有效
    
            // 下面可以访问 localVar,因为它的作用域是整个 main 方法
            System.out.println("Local variable: " + localVar);
        }
    }
    

    在Java中的局部变量作用域与C++基本一样,都是在定义它的大括号之内都有效。

    Go

    func main() {
        var a int = 5
        if a > 0 {
            var b int = 10  // 局部变量 b 只在 if 语句块内有效
            fmt.Println(b)  // 输出 10
        }
        // fmt.Println(b)  // 编译错误:undefined: b
    }
    

    在 Go 中,局部变量通常是在函数内部或控制结构内定义的,通过关键字 var 或者简短声明 :=。这些局部变量的作用域仅限于它们所在的函数或代码块。

    Python

    def func(val):
        if val > 1:
            x = 10
    
        print(x)
    
    func(3);
    

    这个例子的输出结果是10,这与C++是不同的,即使变量 x 是在 if 语句块内定义的,它仍然属于整个函数的局部作用域。if 语句是一个控制流结构,它并不创建一个新的作用域。因此,if 语句内部定义的变量仍然属于函数的局部作用域。

    x = 5
    
    def func(val):
        if val > 1:
            x = 10
    
        print(x)
    
    func(3)
    print(x)
    

    这个例子中数据结果是10和5,因为 x = 10 这一句定义了一个局部变量,要想修改全局变量 x 需要在修改前使用global将x引入才行

    x = 5
    
    def func(val):
        if val > 1:
            global x
            x = 10
    
        print(x)
    
    func(3)
    print(x)
    

    这样修改后,执行的结果就是10 10了,再看一下这个例子

    with open('file.txt', 'r', encoding='utf-8-sig') as file:
        lines = file.readlines()
    
    # 打印读取的内容
    print(lines)
    

    if for 不同的是,with open 语句创建一个代码块,在该代码块内定义的变量(如文件对象)只能在代码块内部访问,比如例子中的 file 变量,在 with 语句块外,该变量已经被销毁,不再存在,而变量 lines 是可以继续访问的。这个例子中还有一个可以学习的知识点,使用 utf-8-sig 编码时,Python 会自动处理 BOM,并在读取文件时去除它

    Lua

    local a = 5
    
    if a > 0 then
        local b = 10  -- 局部变量 b 只在 if 语句块内有效
        print(b)  -- 输出 10
    end
    
    -- print(b)  -- 这里会报错:attempt to index global 'b' (a nil value)
    

    在 Lua 中,局部变量是通过 local 关键字来定义的。局部变量的作用域通常仅限于它所在的代码块、函数或控制结构。它的生命周期从定义开始,到代码块或函数结束为止。

    使用Lua时要格外注意local关键字,如果不加就变成全局变量了,这是一个非常容易出错的点。

    JavaScript

    function example() {
        let y = 20;  // 局部变量 y 只在当前代码块内有效
        if (true) {
            var x = 10;  // 局部变量 x 在函数内有效
            let z = 30;  // 局部变量 z 只在 if 块内有效
            console.log(y);  // 输出 20
            console.log(z);  // 输出 30
        }
        // console.log(z);  // 会报错:Uncaught ReferenceError: z is not defined
        console.log(x);     // 正常访问
    }
    
    example();
    

    在 JavaScript 中,局部变量是通过 var、let 或 const 关键字来定义的。它们的作用域通常仅限于它们定义的函数、代码块或循环。var 创建的是函数作用域的变量,letconst 创建的是块级作用域的变量。

    总结

  • C++JavaGo 等编译语言中局部变量作用域基本一致,仅限于它们所在的函数或代码块
  • Lua 默认全局,使用时多加上local表示局部,作用域仅限于它们所在的函数或代码块,需考虑闭包内
  • Python 中的变量作用域我认为是最复杂的,还要区分 forifwith 等控制流是否创建了新的作用域
  • JavaScript 在代码中引入 var 来定义函数作用域的变量、使用 letconst 创建的是块级作用域的变量,看起来更清晰一些

  • ==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==


    否极泰来;满招损,谦受益;随着学习的深入渐渐发现了这些词语的来历。易经,一部讲述变化的著作,视图将世间万物分类。尚不能让所有人同等看待一件小事,更何况这纷繁的大千世界,所以对于易经,对于分类,每个人都有自己的看法,无关对错~

    作者:AlbertS

    物联沃分享整理
    物联沃-IOTWORD物联网 » 常见编程语言C++、Python、Js中局部变量作用域的差异

    发表回复