python函数变量的用法

本文介绍了在Python中如何在函数内部修改外部变量的值,包括通过返回值、全局变量、修改可变对象如列表或字典的内部元素以及修改类的成员变量等方法,并详细解释了每种方法的工作原理。

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

如果想要在一个函数内部来修改外部变量的值,有下面四种方法:

a>通过返回值赋值 b>使用全局变量 c>修改list或dict对象的内部元素 d>修改类的成员变量

# return的时候,把函数内x的引用返回来了,并赋值给a
def f(x):
    x = 3
    print('x', x, id(x))
    return x
a = 1
print('原先a的地址:',id(a))
a = f(a)
print('a的地址变了,和函数内x的地址一样', a, id(a))
# 原先a的地址: 9289312
# x 3 9289376
# a的地址变了,和函数内x的地址一样 3 9289376

# x是全局变量,如果在函数内部不加global x的话,函数内部可以调用全局变量x,但不可以直接修改
# 加上的话就可以修改全局变量的值,一句话,不加global只能调用,加上可以直接修改.
def func():
    global x
    x = 10
x = 5
func()
print('函数把变量值修改了', x)
# 函数把变量值修改了 10

def fun1(m):
    m[0] = 20
    # 这一步m变成了新的对象,最后返回的而是[4,5,6]
    m = [4, 5, 6]
    # print(id(m))
    return m
l = [1, 2, 3]
# 函数可以通过对可变对象(list dict)内部元素的修改来修改外部变量的值. 注意由于fun1里面没有写global m,所以传过去的m都是局部变量
# 但函数结束调用后却把变量的值给修改了,就是因为执行fun1(l)的时候,把l的引用传给了m,而又因为list是可变对象的缘故,在函数内部修改m,也会改变外面l的值,
t = fun1(l)
# print(id(t))
print(t)
print('l的值变了',l)
# 这一步和上面的不一样,由于用 + 合并list是产生新的对象,所以传参的时候就
# 这里如果用切片法传也一样,因为切片是浅拷贝,所以传过去是新的对象
fun1(l+[2])
print('l的值没变',l)
# [4, 5, 6]
# l的值变了 [20, 2, 3]
# l的值没变 [20, 2, 3]

局部变量和全局变量

局部变量是函数开头声明的,如果没有声明则是全局变量,在函数内部全局变量(仅限于不可变对象)只可调用,不可修改引用,对于可变对象的全局变量,可以修改内容,不可修改引用.

def fun():
    # 这里b c都是全局变量
    print(b)
    print(c)
    # 由于b是可变对象,所以可以修改其内容,但不能改变其引用,
    b[0] = 11111
    print(b)
    # 以下两行都会报错,因为b,c都是全局变量,下面的两种赋值都改变了对象的引用了,
    # 所以会报错UnboundLocalError: local variable 'b' referenced before assignment
    # b = [2,3,4]
    # c = 999
b = [1,2,3]
c = 5
fun()
# [1, 2, 3]
# 5
# [11111, 2, 3]

全局变量与局部变量的识别,注意嵌套函数中的不是全局变量.

def fun():
    # 这样写会报错,因为对于不可变的对象的全局变量,在函数内部只能引用,不可修改
    # UnboundLocalError: local variable 'b' referenced before assignment
    # b = b + 4
    # 注意这样写的话,是在函数内部定义了局部变量b,后续可以直接修改
    b = 5
    # 如果局部变量与全局变量变量名一样,则优先调用局部变量
    b = b + 4
    print('b is:',b)
b = 5
fun()
# b is: 9

def fun1(a):
    # 这里的x是定义的局部变量,不是fun2()函数的局部变量
    x = 1
    def fun2(b):
        global x
        x = x + 2
        print('x is:',x)
    fun2(3)
# 如果把这个x = 10注释掉,会报错,全局变量是函数最外面的变量,嵌套函数外的变量不是全局变量
x = 10
fun1(5)
# x is: 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值