可变/不可变类型与局部/全局变量对比

1.可变类型与不可变类型[记住面试常考]

  • 根据内存中的数据是否允许修改,将数据类型分为可变类型与不可变类型

  • 简单理解: 不使用等号,能不能修改数据值

  • 可变类型: 可以修改 →助记:常规容器

    • 列表(list) list.append()
    • 字典(dict ) dict.pop()
    • 集合(set)
  • 不可变类型: 不允许修改 →助记:bfsit(男朋友坐着不许跑)

    • 数字类型(int, float , bool)
    • 字符串(str)
    • 元组(tuple)

2.局部变量和全局变量

  • 根据变量定义的位置区分

  • 局部变量

    1,在函数内部定义的变量,称为是局部变量

    2, 特点

    • 2.1 局部变量,只能在当前函数内部使用

    • 2.2 可以在不同函数内定义名字相同的局部变量

    3, 生命周期(使用范围)

    • 3.1 在函数执行(调用)的时候被创建

    • 3.2 函数执行结束被销毁(删除)

    4, 形参可以认为是局部变量

    5, 如果想要在函数外部使用局部变量的值, 使用 return 返回

  • 全局变量

    1, 在函数外部定义的变量

    2, 特点

    • 2.1 全局变量可以在任意函数内访问(读取)
    • 2.2 想要在函数内部修改全局变量的引用,需要使用 global 关键字声明(使用 global 关键字可以声明为全局变量)
    • 2.3 如果在函数内部出现和全局变量名字相同的局部变量,在函数内部使用的是局部变量

    3, 生命周期

    • 代码执行的时候创建, 执行结束销毁
    •   # 定义全局变量
        g_num = 10
         
         
        def func_1():
            print(g_num)  # 使用全局变量
         def func_2():
            g_num = 20  # 定义局部变量
            print(g_num)
         
         
        def func_3():
            global g_num   # 声明为全局变量
            g_num = 30
            print(g_num)
         
         
        if __name__ == '__main__':
            print(g_num)  # 10
            func_1()  # 10
            func_2()  # 20
            func_1()  # 10
            print(g_num)  # 10
            func_3()  # 30  修改了全局变量, 将全局变量的值改为30 了
            func_1()  # 30
            g_num = 100
            func_1()  # 100  修改全局变量的值
            func_2()  # 20  局部变量
            func_3()  # 30
            func_1()  # 30   
      
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的函数实现: ```python def ball_drop(height=100): """模拟橡皮球从一定高度落下,并弹起 3/5 高度后再落下,重复直到不再弹起""" count = 0 # 弹起次数 while height > 0: count += 1 print(f"第 {count} 次落地后反弹高度为 {height * 3/5:.2f} 米") height *= 3/5 # 计算下一次弹起高度 print(f"共弹起 {count} 次") ``` 接下来,我们分别进行实验: 1. 默认参数的使用 调用函数 `ball_drop()`,默认高度为 100 米,结果如下: ``` 第 1 次落地后反弹高度为 60.00 米 第 2 次落地后反弹高度为 36.00 米 第 3 次落地后反弹高度为 21.60 米 第 4 次落地后反弹高度为 12.96 米 第 5 次落地后反弹高度为 7.78 米 第 6 次落地后反弹高度为 4.67 米 第 7 次落地后反弹高度为 2.80 米 第 8 次落地后反弹高度为 1.68 米 第 9 次落地后反弹高度为 1.01 米 第 10 次落地后反弹高度为 0.61 米 共弹起 10 次 ``` 2. 函数的返回值 我们可以将弹起次数和最终落地的高度作为函数的返回值,修改函数如下: ```python def ball_drop_v2(height=100): """模拟橡皮球从一定高度落下,并弹起 3/5 高度后再落下,重复直到不再弹起""" count = 0 # 弹起次数 while height > 0: count += 1 print(f"第 {count} 次落地后反弹高度为 {height * 3/5:.2f} 米") height *= 3/5 # 计算下一次弹起高度 print(f"共弹起 {count} 次") final_height = height / (3/5) return count, final_height ``` 然后调用函数,获取返回值并打印: ```python result = ball_drop_v2() print(f"弹起次数:{result[0]}, 最终落地高度:{result[1]:.2f} 米") ``` 输出结果为: ``` 第 1 次落地后反弹高度为 60.00 米 第 2 次落地后反弹高度为 36.00 米 第 3 次落地后反弹高度为 21.60 米 第 4 次落地后反弹高度为 12.96 米 第 5 次落地后反弹高度为 7.78 米 第 6 次落地后反弹高度为 4.67 米 第 7 次落地后反弹高度为 2.80 米 第 8 次落地后反弹高度为 1.68 米 第 9 次落地后反弹高度为 1.01 米 第 10 次落地后反弹高度为 0.61 米 共弹起 10 次 弹起次数:10, 最终落地高度:0.92 米 ``` 3. 量的作用域 函数内部定义的量是局部量,在函数外部无法访问,示例代码如下: ```python def ball_drop_v3(height=100): """模拟橡皮球从一定高度落下,并弹起 3/5 高度后再落下,重复直到不再弹起""" count = 0 # 弹起次数 while height > 0: count += 1 print(f"第 {count} 次落地后反弹高度为 {height * 3/5:.2f} 米") height *= 3/5 # 计算下一次弹起高度 print(f"共弹起 {count} 次") final_height = height / (3/5) return count, final_height ball_drop_v3() print(count) # 会报错,因为 count 是局部量 ``` 4. 在函数内部使用全局变量 可以使用 `global` 关键字在函数内部声明全局变量,并且可以在函数内部修改全局变量的值,示例代码如下: ```python count = 0 # 全局变量 def ball_drop_v4(height=100): """模拟橡皮球从一定高度落下,并弹起 3/5 高度后再落下,重复直到不再弹起""" global count # 声明 count 是全局变量 while height > 0: count += 1 print(f"第 {count} 次落地后反弹高度为 {height * 3/5:.2f} 米") height *= 3/5 # 计算下一次弹起高度 print(f"共弹起 {count} 次") final_height = height / (3/5) return count, final_height ball_drop_v4() print(count) # 输出结果为 10,因为 count 是全局变量并且被修改了 ``` 5. 以可变数据类型作为参数,在函数内部对其进行修改 我们可以将一个列表作为参数传递给函数,并在函数内部修改列表的值,示例代码如下: ```python def ball_drop_v5(height, records): """模拟橡皮球从一定高度落下,并弹起 3/5 高度后再落下,重复直到不再弹起""" while height > 0: records.append(height) # 记录每次落地前的高度 height *= 3/5 # 计算下一次弹起高度 return records height = 100 records = [] ball_drop_v5(height, records) print(records) # 输出结果为 [100, 60.0, 36.0, 21.6, 12.959999999999999, 7.775999999999999, 4.665599999999999, 2.7993599999999995, 1.6796159999999998, 1.0077695999999999, 0.6046617599999999] ``` 可以看到,函数内部修改了列表 `records` 的值。 6. 在函数体内部修改值和重新分配量名称之间的区别 这个实验可以通过可变数据类型不可数据类型的区别来进行演示。不可数据类型包括数字、字符串和元组,它们的值无法被修改;可变数据类型包括列表、字典和集合,它们的值可以被修改。 首先定义一个全局变量 `height`,然后定义两个函数 `change_height()` 和 `assign_height()`,分别演示在函数内部修改值和重新分配量名称的区别,示例代码如下: ```python height = 100 # 全局变量 def change_height(h): h *= 2 return h def assign_height(h): h = 200 return h print(change_height(height)) # 输出结果为 200,因为传递给函数的是可变数据类型,函数内部修改了值 print(assign_height(height)) # 输出结果为 200,因为传递给函数的是不可数据类型,函数内部重新分配了量名称 print(height) # 输出结果为 100,因为全局变量没有被修改 ``` 可以看到,`change_height()` 函数和 `assign_height()` 函数的行为是不同的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值