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

前言

编程语言这东西,就得多练,不管之前你掌握的多么扎实,只要是一段时间不使用,再次拿起来时还是很生疏,就比如从入行就写的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 创建的是块级作用域的变量,看起来更清晰一些

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值