python 中全局变量和局部变量的奇怪之处(加引号的无效性)

无效性解释(第一个例子)

  • 开始前明确一点,在函数内部,任意变量都是默认分配到本地命名空间中的。
  • 只有使用了global才会变成全局变量
  • 如果不是全局变量的化,在函数里面操作的变量都是新的变量,在函数运行之后,所有的操作在理论上是”无效的“。加引号的原因 后面会解释

”无效性“测试

代码

str = 'global'
print("函数外面的str(执行函数前)",id(str))
def func1():
    str = 'local'
    print("函数里面的创建的str",id(str))
    print("函数里面的str",str)
    
func1()
print("函数外面的str(执行函数后)",id(str))
print("函数外面的str",str)

运行结果

 引用global之后

str = 'global'
print("函数外面的str(执行函数前)",id(str))
def func1():
    global str
    str = 'local' #会改变 因为str指向了新的对象 而且在函数运行后不会被删除
    print("函数里面的创建的str",id(str))
    print("函数里面的str",str)
    
func1()
print("函数外面的str(执行函数后)",id(str))
print("函数外面的str",str)

运行结果

 

无效性加引号的原因(第二个例子)

  • 解释’无效性‘加引号的原因,也是奇怪之处 看这段代码
c = []
def func():
    for i in range(5):
        c.append(i)
    print("函数里面的",c)

    
func()
print ("操作后的c",c)
  • 按照之前的逻辑来说,输出的应该是  []  ,但结果不是

 让我们加上地址看一看为什么会出现这样的现象

c = []
print('没有被函数操作前的c',id(c))
def func():
    for i in range(5):
        c.append(i)
        print("操作的c",id(c))
    print("函数里面的",c)

    
func()
print ("操作后的c",id(c))
print ("操作后的c",c)

  •  根据id  很明显都是对同一个对象进行操作的 因此会“无效性”才会加引号

产生这样的原因

    python 中对变量进行赋值的时候,是通过创建一个指向等号右边对象的引用。在第二个例子中,a并没有指向新的对象,而是直接对函数外的对象进行操作了,地址没有变,因此会保留。在第一个例子中是指向了新的对象(有了新地址),当函数运行完成之后,这个新的新变量(同名不同地址)就会被系统回收,加上global之后就不会被回收了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值