常见编程语言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++中变量在定义它的大括号之内都有效,像 if
、for
等语句中定义的变量,在它们紧跟着的大括号内有效,例如例子中的 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
创建的是函数作用域的变量,let
和 const
创建的是块级作用域的变量。
总结
C++
、 Java
、Go
等编译语言中局部变量作用域基本一致,仅限于它们所在的函数或代码块Lua
默认全局,使用时多加上local表示局部,作用域仅限于它们所在的函数或代码块,需考虑闭包内Python
中的变量作用域我认为是最复杂的,还要区分 for
、 if
、with
等控制流是否创建了新的作用域JavaScript
在代码中引入 var
来定义函数作用域的变量、使用 let
或 const
创建的是块级作用域的变量,看起来更清晰一些==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==
否极泰来;满招损,谦受益;随着学习的深入渐渐发现了这些词语的来历。易经,一部讲述变化的著作,视图将世间万物分类。尚不能让所有人同等看待一件小事,更何况这纷繁的大千世界,所以对于易经,对于分类,每个人都有自己的看法,无关对错~
作者:AlbertS