Python 形参和实参,局部变量和全局变量的含义理解及使用

本文介绍了Python中的形参和实参概念,形参作为函数参数的占位符,而实参则是调用时传递的值。接着讨论了变量作用域,包括局部变量和全局变量的定义,以及如何在函数内部修改全局变量的值。通过示例解释了局部变量仅在函数内部有效,全局变量在整个程序中都可访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、形参和实参

1.1 形参的含义及使用

1.2 实参的含义及使用

2、局部变量和全局变量

2.1 变量作用域的概念

2.2 局部变量

2.3 全局变量

2.4 修改全局变量值


1、形参和实参

1.1 形参的含义及使用

  • 形参 :形式参数,表示函数内所要用的参数的类型和名字,没有确定值

形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。(定义函数的时候,括号里面写的那个参数名称,他只对那个函数内部有效,也就是函数内部就可以直接用这个名称,其他地方即使有同样的名称,也是和这个函数里面不同的。)

def function(name):

这里面的参数name就是形参,它代表的是所用参数的形式。只占据一个参数位置,没有具体值。

1.2 实参的含义及使用

  • 实参 :实际参数,是调用函数时传递的值,也就是执行这个参数时真正的参数。实参是实际存在的,已经确定的参数,常量,变量,表达式,都是实参。
#定义函数
print(name + ‘123’)

#调用函数
function(‘hello’)

上面print中的name为实参,调用函数中的hello也是实参,因为它们代表的是具体的参数值。 

2、局部变量和全局变量

2.1 变量作用域的概念

首先我们要知道变量作用域:变量作用域指的是变量生效的范围,主要分为两类:局部变量和全局变量。
(1)变量作用范围:可操作范围;
(2)Python 是静态作用域,变量的作用域源于它在代码中的位置;
(3)在不同的位置,可能有不同的命名空间。

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域是:全局变量、局部变量。

2.2 局部变量

  • 定义:在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能使用了,我们将这样的变量称为局部变量。

#定义一个函数,声明一个变量:分别测试函数体内访问、函数体外访问
def testA():
    a = 100
    print(a) #函数体内部访问,能访问到a变量
             #定义函数

testA() #调用函数
# print(a) #报错:a变量是函数内部的变量,函数外无法访问--因为a是一个局部变量,这就证实了当函数执行完毕后,其内部定义的变量会被销毁并回收。

上面的变量a为局部变量是定义在testA函数内部的变量,在函数外部访问则会立即报错。(当函数被执行时,Python 会为其分配一块临时的存储空间,所有在函数内部定义的变量,都会存储在这块空间中。而在函数执行完毕后,这块临时存储空间随即会被释放并回收,该空间中存储的变量自然也就无法再被使用。)

  • 局部变量作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

2.3 全局变量

  • 定义:在函数体内、外都能生效的变量。

#声明全局变量:函数体内外都能访问
a = 100
print(a)

def testA():
    print(a)# 访问全局变量a,并打印变量a存储变量

def testB():
    print(a)# 访问全局变量a,并打印变量a存储变量

testA()
testB()
# 100
# 100

上面的a并未放在任何函数中,因此任何函数都可以访问a,所以a是全局变量。

  • 区别:和局部变量不同,全局变量的默认作用域是整个程序,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用。因此由上面的定义和例子也可以看出,所谓的全局变量跟局部变量主要是针对函数内外而言的

2.4 修改全局变量值

那么,如何将上例中testB()函数中变量a的值修改为200呢?

# a = 100
# print(a)
# def testA():
    # print(a)
# def testB():
    # a = 200 #如果直接修改a=200,此时的a是全局变量还是局部变量?结论:这个a是局部变量
    #         因为在全局位置(B函数调用后)打印a得到的不是200而是100
    # print(a)
# testA()
# testB()
# 100 全局变量
# 100 全局变量
# 200 局部变量
# print(a)
# 100

# 可以看出,如果在函数里面直接把变量a=200赋值,此时a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量。



a = 100

def testA():
    print(a)

def testB():
    # global 关键词声明a是全局变量
    global a
    a = 200
    print(a)

testA()
testB()

print(a)
# 100
# 200
# 200

因此,要想修改全局变量,我们可以引入global关键词声明a是全局变量。

 

### 形参全局变量同名时的行为及可能引发的问题 在编程语言中,形参(形式参数)是函数定义时声明的变量,用于接收调用时传递的实际参数(实参)。当形参全局变量同名时,可能会引发作用域冲突或变量覆盖问题。以下是详细分析: #### 1. 作用域优先级 在大多数编程语言中,函数内部的局部变量(包括形参)具有更高的作用域优先级。这意味着在函数内部访问同名变量时,会优先使用局部变量形参,而不是全局变量[^1]。 例如,在以下代码中: ```javascript var globalVar = 10; function test(globalVar) { console.log(globalVar); // 输出形参值 } test(20); // 输出 20 console.log(globalVar); // 输出 10 ``` 在 `test` 函数内部,`globalVar` 被视为形参,而不是全局变量。因此,函数内部的操作不会影响全局变量的值。 #### 2. 影响与行为 当形参全局变量同名时,可能会导致以下问题: - **遮蔽效应**:形参会遮蔽全局变量,使得在函数内部无法直接访问全局变量。如果需要访问全局变量,必须通过其他方式,例如明确指定全局对象(如 `window` 或 `globalThis`)[^4]。 示例: ```javascript var globalVar = 10; function test(globalVar) { console.log(globalVar); // 输出形参值 console.log(window.globalVar); // 访问全局变量 } test(20); ``` - **意外覆盖**:如果开发者误以为形参会影响全局变量,可能会导致逻辑错误。实际上,形参仅在函数作用域内生效,对全局变量无直接影响[^3]。 #### 3. 数据类型的影响 对于基本数据类型(如数字、字符串),形参全局变量之间的交互是值传递。形参的改变不会影响全局变量的值[^4]。 对于引用数据类型(如对象、数组),形参接收到的是全局变量的引用。修改形参指向的对象属性会影响全局变量对应的对象属性,但如果重新赋值给形参,则会断开引用关系[^3]。 示例: ```javascript var obj = { value: 1 }; function modify(obj) { obj.value = 2; // 修改对象属性 obj = { value: 3 }; // 重新赋值,断开引用 } modify(obj); console.log(obj.value); // 输出 2 ``` #### 4. 最佳实践 为了避免形参全局变量同名带来的问题,建议遵循以下最佳实践: - 避免形参全局变量同名,以减少混淆。 - 如果需要在函数内部访问全局变量,可以显式引用全局对象(如 `window` 或 `globalThis`)。 - 对于引用类型的数据,注意区分属性修改重新赋值的区别。 ### 示例代码 以下是一个综合示例,展示形参全局变量同名时的行为: ```javascript var globalVar = 10; var globalObj = { key: "value" }; function test(globalVar, globalObj) { console.log(globalVar); // 输出形参值 console.log(globalObj.key); // 输出形参对象的属性 globalVar = 20; // 修改形参值 globalObj.key = "new value"; // 修改形参对象的属性 globalObj = { key: "another value" }; // 重新赋值,断开引用 console.log(globalVar); // 输出 20 console.log(globalObj.key); // 输出 "another value" } test(30, { key: "local value" }); console.log(globalVar); // 输出 10 console.log(globalObj.key); // 输出 "new value" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值